gpt4 book ai didi

c++ - 如果调用 delete array 而不是 delete []array,_CrtMemDumpAllObjectsSince() 函数无法检测到泄漏

转载 作者:行者123 更新时间:2023-11-28 00:57:00 40 4
gpt4 key购买 nike

下面是一些示例代码:

#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() 没有在上面的代码中转储泄漏。

最佳答案

官方的回答是将 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; 时就不会泄漏了(实际上,做一个快速检查一下,我发现至少对我来说它会按原样崩溃,所以你仍然可能不会收到泄漏报告,但你肯定会很快知道出了什么问题)。

关于c++ - 如果调用 delete array 而不是 delete []array,_CrtMemDumpAllObjectsSince() 函数无法检测到泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10545436/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com