C++ 为什么这两个类似的函数中有一个崩溃,而另一个正常工作?
这真的很奇怪。如果我将C++ 为什么这两个类似的函数中有一个崩溃,而另一个正常工作?,c++,arrays,function,pointers,dynamic-memory-allocation,C++,Arrays,Function,Pointers,Dynamic Memory Allocation,这真的很奇怪。如果我将asize的值增加一个crashSystem()就可以实现它的名称。第二个函数返回一个int指针,在值大得多的情况下工作正常。这两个函数只是删除并分配相同大小的相同动态数组(我创建它只是为了测试目的) 注意:我认为这可能与最大堆栈容量1MB有关(130037*8字节接近1MB),但这真的很奇怪,因为使用new内部函数进行分配应该与任何其他new的工作原理相同 使用Visual Studio 2015 #include <iostream> void crash
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");
}
#包括
void crashSystem(int*dynamicArray,int-asize){
删除【】个字符;
//dynamicArray=nullptr;根本不重要
dynamicArray=新整数[asize];
std::cout问题在于,您正在按值传递指针,因此它仍然指向新的int[asize];
在main()
中分配的,然后在其上执行。
在第一次delete[]
调用之后,它将变成一个
如果指针不是通过引用传递的,即使赋值nullptr
也不会有帮助
worksOk
有效,因为您返回指向新分配空间的指针并进行分配,所以每次都有效
只需更改签名,使其使用引用:
void crashSystem(int *&dynamicArray, int asize)
它应该可以正常工作。如果您编写dynamicArray=worksOK(…)
的话,我认为worksOK只能正常工作。对吗?我只是用这种方法测试它,我的意思是作为一个返回函数。哇!它现在真的可以工作了,谢谢。真不敢相信解决方案这么简单。那只是为了测试目的,我通常一直都在使用它