c++ - 在 C++ 中新建/删除奇怪的内存泄漏

标签 c++ memory-leaks

下面是我的问题和代码:

  1. 当代码运行到第26行时,这个进程获得的内存没有返回给OS?
  2. 但是,如果我删除第 16 行,内存会被正确释放吗?

我知道这不是使用这么多小内存块的常规方式,但我非常想知道原因。

我用 MALLOC_MMAP_MAX_=1000000 MALLOC_MMAP_THRESHOLD_=1024 运行了这个程序,但没有任何改变。

int i = 0;
std::cout << "waitting for input, you can check current memory" << std::endl;
std::cin >> i;
char** ptr = new char *[1000000];
std::map<int, char *> tMap;
for (unsigned long i = 0; i < 1000000; i ++)
{
    ptr[i] = new char[3000];
    tMap.insert(make_pair(i, ptr[i]));    //line 16
}
std::cout << "waitting for input, you can check current memory" << std::endl;
std::cin >> i;
for (unsigned long i = 0; i < 1000000; i ++)
{
    delete []ptr[i];
}
delete []ptr;
std::cout << "waitting for input, you can check current memory" << std::endl;
std::cin >> i;   //line 26
return 0;

资料比较多,我查了下tMap的内存,不到100M。

1、分配内存并停止,检查内存资源:

holds 2.9G memory

2、释放内存并停止,检查内存资源:

holds 2.9G memory

最佳答案

C++ 没有垃圾收集,因此保留指针的额外拷贝不会阻止内存被释放。

delete[] ptr[i] 之后发生的事情是映射充满了不能再使用的悬挂指针。


另一个想法:您可能认为内存泄漏是因为 tMap 分配动态内存来存储插入的数据。该内存将在 map 超出范围时释放,就在第 27 行之后。

关于c++ - 在 C++ 中新建/删除奇怪的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48580261/

相关文章:

c++ - 该程序中的常驻内存行为?

c - C 中的 Trie : Pointer detected as null. 导致内存泄漏

c++ - 如何检索类 :function with clang

c++ - Lucas-Kanade 算法的计算复杂度是多少?

c++ - 在结构中使用 Vulkan 唯一句柄会导致 "implicitly deleted"错误

tomcat - 负载测试期间内存不断上升

重复 .ajax 调用导致 jQuery 内存泄漏

Javascript内存泄漏setTimeout问题

c++ - 用tm加减时间

c++ - 我可以以任何方式将数据分配给从 OpenCV 对象取消引用的双函数返回检索吗?