这真的很奇怪。如果我将asize
的值仅增加一crashSystem()
,就会发出其名称所说的内容。返回int指针的第二个函数可以使用更大的值。这两个函数只是删除并分配相同大小的相同动态数组(我创建它只是为了测试目的)。
注意:我认为它可能与最大堆栈容量1MB(130037 * 8字节接近1MB)有关,但它真的很奇怪导致使用new
内部分配函数应该与任何其他new
一样工作。
使用Visual Studio 2015
#include <iostream>
void crashSystem(int * dynamicArray, int asize) {
delete[] dynamicArray;
//dynamicArray = nullptr; does not matter at all
dynamicArray = new int[asize];
std::cout << "mem allocated\n";
}
int * worksOk(int * dynamicArray, int asize) {
int * newDynamicArray = new int[asize];
delete[] dynamicArray;
std::cout << "mem allocated\n";
return newDynamicArray;
}
int main()
{
int asize = 130037; // dynamic array size
//asize = 12330037; // for testing second function that works
int * dynamicArray;
dynamicArray = new int[asize];
for (int i = 0; i < 100; i++)
{
std::cout << "iteration " << i << " ";
crashSystem(dynamicArray, asize);
//dynamicArray = worksOk(dynamicArray, asize);
}
std::cout << "\n";
system("PAUSE");
}
注意2:在发布模式下以这种方式崩溃应用程序会通过创建不存在的进程来阻止可执行文件(使用Process Hacker 2进行检查)
答案 0 :(得分:6)
问题在于您是按值传递指针,因此它仍然指向new int[asize];
中分配的main()
,然后您call multiple delete []
。
在第一次delete []
通话后,它会变为dangling pointer。
如果没有通过引用传递指针,即使分配nullptr
也无济于事。
worksOk
有效,因为你返回的指针指向新分配的空间并分配它,所以它每次都有效。
只需更改签名即可使用引用:
void crashSystem(int *&dynamicArray, int asize)
它应该可以正常工作。