为什么这两个相似的函数中的一个崩溃而且一个正常?

时间:2015-10-17 09:48:16

标签: c++ arrays function pointers 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");
}

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

1 个答案:

答案 0 :(得分:6)

问题在于您是按值传递指针,因此它仍然指向new int[asize];中分配的main(),然后您call multiple delete []。 在第一次delete []通话后,它会变为dangling pointer

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

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

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

void crashSystem(int *&dynamicArray, int asize)

它应该可以正常工作。