0

我一直在为学校研究排序算法,遇到了一个奇怪的问题。当我创建一个大于六个元素的整数数组时,我会在“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 中的输出会说明添加堆保护分流器,这似乎解决了引发异常的测试,但仍然不能解决大型应用程序中的问题(我会觉得不得不需要将这种保护应用于我的代码)。

谢谢!

4

3 回答 3

7

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

int* pie = new int[7];

在结束时释放内存也不会受到伤害main:)

delete[] pie;
于 2013-03-29T20:55:30.893 回答
3

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

于 2013-03-29T20:55:12.857 回答
1

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

int* pie = new int[7];

否则,您只分配一个 int

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

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

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

更多信息在:C++ 动态内存分配

运算符 new 和 new[]

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

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

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

 

运算符 delete 和 delete[]

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

delete pointer;
delete [] pointer;

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

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

于 2013-03-29T20:57:35.703 回答