为什么这两个相似的功能之一崩溃而一个工作正常?

Why one of those two similar functions crashes and one works ok?

这真的很奇怪。如果我将 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 检查)

问题是您按值传递指针,所以它仍然指向 main() 中分配的 new int[asize];,然后您在 call multiple delete [] 上分配。 它在第一个 delete [] 调用后变为 dangling pointer

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

worksOk 有效,因为你返回指向新分配的 space 的指针并分配它,所以它每次都有效。

只需更改签名,使其使用参考:

void crashSystem(int *&dynamicArray, int asize)

它应该可以正常工作。