【问题标题】:Windows C++ Integer Array Heap CorruptionWindows C++ 整数数组堆损坏
【发布时间】:2013-03-29 20:53:58
【问题描述】:

我一直在为学校研究排序算法,遇到了一个奇怪的问题。当我创建一个大于六个元素的整数数组时,我会在“free.c”和堆损坏错误中遇到中断。

我将其缩小到的代码如下。

#include <iostream>

using namespace std;

int main(){
    int * pie = new int(7);
    pie[6] = 1;

    cout << pie[6];

    return 0;
}

有时您需要分配的不仅仅是最后一个值,但是我可以在多台计算机上的 Visual Studio 2012 和 2010 上遇到此错误,但是在 Linux 中,此代码可以正常工作。

这是 Windows 的问题吗,我一直在做动态 int 数组错误还是什么?

注意:运行几次后,有时 VS 中的输出会说明添加堆保护分流,这似乎解决了抛出异常的测试,但仍然不能解决大型应用程序中的问题(我会觉得不得不将这种保护应用于我的代码,这很糟糕)。

谢谢!

【问题讨论】:

    标签: c++ arrays visual-studio-2010 visual-studio-2012 int


    【解决方案1】:

    在这种情况下,您分配了一个值为7 的整数,但将其视为7 元素的数组。你需要做一个实际的数组分配

    int* pie = new int[7];
    

    main 的末尾释放内存也不会有什么坏处:)

    delete[] pie;
    

    【讨论】:

      【解决方案2】:

      new int(7) 分配一个 int,值为 7。它不为 7 个 int 值分配空间。

      【讨论】:

      • 哇!我不敢相信我正在这样做>。
      • 因为 C++ 永远不会为您提供这种保护(它为了速度而牺牲了它)。您只需要学习仔细编程,并遵循最佳实践。这是非常非常重要的。最重要的最佳实践之一是不使用指针,除非您需要它们。在您的情况下,您应该有一个向量,而不是尝试分配自己的内存。
      【解决方案3】:

      要解决您的问题,您需要使用:

      int* pie = new int[7];
      

      否则,您只分配 一个 int

      执行下面的代码,将覆盖超出数组边界的任何内容。

      int * pie = new int(7);
      pie[6] = 1;
      

      这可能会导致难以跟踪的随机错误。例如,如果它覆盖了一个指针……

      更多信息在:C++ Dynamic Memory allocations

      新运营商和新运营商[]

      为了请求动态内存,我们使用操作符 new。 new 后跟一个数据类型说明符和 -if a
      需要多个元素的序列 - 这些元素的数量
      在括号 [] 内。它返回一个指向 new
      开头的指针 分配的内存块。它的形式是: 指针 = 新类型指针 = 新类型 [number_of_elements] 第一个表达式用于分配内存以包含一个 type 类型的元素。第二个用于分配一个 类型类型元素的块(数组),其中 number_of_elements 是表示这些数量的整数值。例如:

      int * bobby; 
      bobby = new int [5];
      

      在这种情况下,系统会为五个元素动态分配空间 类型为 int 并返回指向第一个元素的指针 序列,分配给鲍比。因此,现在,鲍比指出 一个有效的内存块,有五个 int 类型元素的空间。

       

      运算符删除和删除[]

      由于动态内存的必要性通常仅限于特定的 程序中的时刻,一旦不再需要它就应该 释放,以便内存再次可用于其他请求 动态记忆。这就是操作员删除的目的,其 格式为:

      delete pointer;
      delete [] pointer;
      

      第一个表达式应该用于删除分配给 单个元素,第二个用于为数组分配的内存 元素。

      作为参数传递给 delete 的值必须是指向 以前用新的或空指针分配的内存块(在 空指针的情况下,删除无效)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-03
        • 2011-08-03
        • 2019-08-28
        • 2020-10-02
        相关资源
        最近更新 更多