Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么这两个类似的函数中有一个崩溃,而另一个正常工作?_C++_Arrays_Function_Pointers_Dynamic Memory Allocation - Fatal编程技术网

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只能正常工作。

对吗?我只是用这种方法测试它,我的意思是作为一个返回函数。哇!它现在真的可以工作了,谢谢。真不敢相信解决方案这么简单。那只是为了测试目的,我通常一直都在使用它