繁体   English   中英

C ++中新的/删除的奇怪的内存泄漏

[英]Strange Memory leak by new/delete in C++

以下是我的问题和代码:

  1. 当代码运行到第26行时,通过此过程获得的内存不会返回OS?
  2. 但是,如果删除第16行,内存将被正确释放吗?

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

我已经使用MALLOC_MMAP_MAX_=1000000 MALLOC_MMAP_THRESHOLD_=1024,运行了该程序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,分配内存并停止,检查内存资源:

拥有2.9G内存

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

拥有2.9G内存

C ++没有垃圾回收,因此保留额外的指针副本不会阻止内存的释放。

delete[] ptr[i]之后发生的情况是,该映射充满了无法使用的悬空指针。


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

1,当代码运行到第26行时,通过此过程获得的内存不返回OS?

不能保证C ++程序因为该程序正确delete内存而将任何内存释放到操作系统 在许多C ++运行时中,删除的动态分配内存仍将保留给同一程序以供将来使用,而不释放给OS。 GCC / Linux是编译器/运行时环境的示例,其中通常在共享内存段中进行较大的分配,这些共享内存段可以在程序终止之前释放到操作系统,以便OS或其他程序可以使用它们。

2,但是,如果我删除第16行,内存会正确释放吗?

第16行与第22行中的稍后删除/重新分配内存没有任何区别(这可能会将其返回到应用程序以后可以重新分配的动态内存池中,或者如上所述将其释放到OS中) )。 它确实涉及到对std::map元素本身的更多动态分配。

请注意, tMap析构函数本身不会以任何方式delete或释放内存。 要通过类似指针的变量或通过其容器自动释放内存,请使用诸如std::shared_ptrstd::unique_ptr类的智能指针 (您可以在Google上搜索其信息)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM