【问题标题】:_CrtMemDumpAllObjectsSince() function is not able to detect leaks if delete array called instead of delete []array_CrtMemDumpAllObjectsSince() 函数如果调用 delete 数组而不是 delete []array 则无法检测到泄漏
【发布时间】:2012-05-11 04:26:22
【问题描述】:

这里是一些示例代码:

#include <crtdbg.h>
#include <windows.h>

#ifdef _DEBUG
#define new DEBUG_CLIENTBLOCK
#endif

int main()   
{
   int* arr = new int[10];
   delete arr;     //not using delete [] arr
   _CrtMemDumpAllObjectsSince(NULL); // dumping leak logs 


  return 0;
}

如您所见,我没有使用delete [] arr,但仍然没有任何泄漏。

谁能更正它并解释为什么_CrtMemDumpAllObjectsSince() 没有在上面的代码中倾倒泄漏。

【问题讨论】:

    标签: c++ arrays memory-leaks delete-operator


    【解决方案1】:

    官方的回答是,将new[]delete 配对会产生未定义的行为,因此您不能指望从那时起发生任何有用的事情。

    通常更有帮助的非官方答案是,当您这样做时(new[]delete)通常会发生内存块返回到堆,但是析构函数不会' 不会在数组中的对象上调用。换句话说,这些对象没有被正确地销毁,但是被占用的内存被释放了。由于它只检查内存块是否已被释放(并且不知道 dtors),_CrtMemDumpAllObjectsSince() 不会发现任何问题。

    另一方面,考虑这样的事情:

    class stupid {
        char *junk;
    public:
        stupid() { junk = new char[10]; }
        ~stupid() { delete [] junk; }
    };
    
    int main() {
        stupid *stuff = new stupid[10];
    
        delete stuff;
        // delete [] stuff;
        _CrtMemDumpAllObjectsSince(NULL);
        return 0;
    }
    

    这可能会按原样泄漏内存,但是当您使用 delete [] stuff; 而不是 delete stuff; 时不要泄漏它(实际上,快速检查一下,我发现至少对我来说它完全崩溃了 -是的,所以你可能仍然没有得到泄漏报告,但你肯定会很快知道有什么问题)。

    【讨论】:

    • 谢谢杰瑞。我还有一个疑问,为什么程序在您的示例中崩溃。虽然我收到了警报,但还是有问题……
    • @ShashankJain:老实说,我不确定——我预计它会运行,但会产生内存泄漏。我怀疑要弄清楚到底发生了什么并不容易,而且我不愿意花很多时间来弄清楚为什么会发生这种情况,尤其是因为我几乎不再使用new [](而且还没有)多年来没有这样做)。
    【解决方案2】:

    Visual c++ 对数组使用的删除操作符被记录为具有不可预测的结果。我认为因为你有一个整数数组,所以内存被正确释放了,因为数组中的每个元素如果没有被破坏就没有副作用。

    尝试对用户定义类型数组做同样的事情,其中​​每个对象都为某些东西分配自己的内存并在析构函数中释放它。我相信你会有不同的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-03
      • 2010-12-27
      • 2010-11-19
      • 2010-11-14
      • 2020-03-27
      • 2013-06-25
      • 1970-01-01
      相关资源
      最近更新 更多