为什么这两个类似功能中的一个崩溃而且一个正常?

Sha*_*ido 2 c++ arrays pointers function dynamic-memory-allocation

这真的很奇怪.如果我将它的值增加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");
}
Run Code Online (Sandbox Code Playgroud)

注意2:在发布模式下以这种方式崩溃应用程序倾向于通过创建不存在的进程来阻止可执行文件(使用Process Hacker 2检查)

Log*_*uff 6

问题是你是按值传递指针,所以它仍指向已new int[asize];分配的main(),然后你可以调用多个delete [].它在第一次调用后成为悬空指针delete [].

nullptr如果没有通过引用传递指针,即使分配也无济于事.

worksOk 因为您返回指向新分配空间并指定它的指针,所以它每次都有效.

只需更改签名即可使用引用:

void crashSystem(int *&dynamicArray, int asize)
Run Code Online (Sandbox Code Playgroud)

它应该工作正常.