【问题标题】:Why one of those two similar functions crashes and one works ok?为什么这两个类似功能之一崩溃而一个工作正常?
【发布时间】:2015-10-17 09:48:15
【问题描述】:

这真的很奇怪。如果我将asize 的值增加一倍,crashSystem() 就如其名。返回 int 指针的第二个函数适用于更大的值。这两个函数只是删除并分配相同大小的相同动态数组(我创建它只是为了测试目的)。

注意:我认为这可能与最大堆栈容量 1MB 有关(130037 * 8 字节接近 1MB),但这真的很奇怪,因为使用 new 内部函数进行分配应该与任何其他 @ 987654324@.

使用 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 检查)

【问题讨论】:

  • 我认为只有在你写 dynamicArray = worksOK(...) 时才有效,对吧?
  • 我只是这样测试的,我的意思是作为返回函数。

标签: c++ arrays function pointers dynamic-memory-allocation


【解决方案1】:

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

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

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

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

void crashSystem(int *&dynamicArray, int asize)

它应该可以正常工作。

【讨论】:

  • 哇!现在真的可以用了,谢谢。无法相信解决方案如此简单。
  • 那只是为了测试目的,我通常一直使用
猜你喜欢
  • 2015-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多