0

这是一些示例代码:

#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()不在上面的代码中倾倒泄漏。

4

2 回答 2

3

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

通常更有帮助的非官方答案是,当您执行此操作 ( new[]with 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;(实际上,进行快速检查,我发现至少对我来说它会按原样崩溃,所以您仍然可能无法获得泄漏报告,但你肯定会很快知道有什么问题)。

于 2012-05-11T04:42:49.017 回答
0

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

尝试对用户定义类型的数组执行相同的操作,其中每个对象为某些内容分配自己的内存并在析构函数中释放它。我相信你会有不同的结果。

于 2012-05-11T04:43:18.393 回答