如何证明删除不会释放所有内存new []分配?

时间:2016-04-02 17:20:53

标签: c++ memory-management

我想编写一个简单的应用程序,证明如果对使用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.

我的另一个想法是它的工作原理是它的未定义行为,在这种情况下是编译器特定的行为。

1 个答案:

答案 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[]检查它并依次销毁每个对象。