我想编写一个简单的应用程序,证明如果对使用new []分配的指针使用delete,则存在内存泄漏。
我目前正在使用CRT Debug库监视应用程序中的内存,以便在分配后和不正确的释放后捕获内存。请在此处查看我的测试代码:
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#include <iostream>
#include <memory>
using namespace std;
int main()
{
_CrtMemState s1, s2, mem_diff;
// Allocate 40 bytes of memory.
int *leak = new int[10];
// Capture the memory state after the allocation.
_CrtMemCheckpoint(&s1);
// Deallocate that memory with incorrect delete operator.
delete leak;
// Capture and compare the memory after the deallocation.
_CrtMemCheckpoint(&s2);
_CrtMemDifference(&mem_diff, &s1, &s2);
_CrtMemDumpStatistics(&mem_diff);
return 0;
}
但是,在我的调试输出中,我看到所有40个字节都被释放。这是我在Visual Studio 2015 Express中的调试控制台的输出:
0 bytes in 0 Free Blocks.
-40 bytes in -1 Normal Blocks.
0 bytes in 0 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 0 bytes.
Total allocations: 0 bytes.
我的另一个想法是它的工作原理是它的未定义行为,在这种情况下是编译器特定的行为。
答案 0 :(得分:1)
void leak_via_wrong_delete() {
std::vector<int>* buff = new std::vector<int>[1000];
for (auto i = 0; i < 1000; ++i)
buff[i].resize(i * 1000);
delete buff;
}
用泄漏检测代码包装。
实际上,delete[]
重要的真正原因是它调用了数组中所有元素的析构函数,在我所知道的大多数实现中。 (可能有一个中等模糊的平台也会发生灾难性的失败,我不记得了。)
对于没有轻微破坏的类,它们在分配的数组的开始之前字节中存储元素的数量(或类似的东西)。然后delete[]
检查它并依次销毁每个对象。