【发布时间】:2015-10-17 09:48:15
【问题描述】:
这真的很奇怪。如果我将asize 的值增加一倍,crashSystem() 就如其名。返回 int 指针的第二个函数适用于更大的值。这两个函数只是删除并分配相同大小的相同动态数组(我创建它只是为了测试目的)。
注意:我认为这可能与最大堆栈容量 1MB 有关(130037 * 8 字节接近 1MB),但这真的很奇怪,因为使用 new 内部函数进行分配应该与任何其他 @ 987654324@.
使用 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 检查)
【问题讨论】:
-
我认为只有在你写
dynamicArray = worksOK(...)时才有效,对吧? -
我只是这样测试的,我的意思是作为返回函数。
标签: c++ arrays function pointers dynamic-memory-allocation