下面是我的问题和代码:
- 当代码运行到第26行时,这个进程获得的内存没有返回给OS?
- 但是,如果我删除第 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、分配内存并停止,检查内存资源:
2、释放内存并停止,检查内存资源:
最佳答案
C++ 没有垃圾收集,因此保留指针的额外拷贝不会阻止内存被释放。
delete[] ptr[i]
之后发生的事情是映射充满了不能再使用的悬挂指针。
另一个想法:您可能认为内存泄漏是因为 tMap
还 分配动态内存来存储插入的数据。该内存将在 map 超出范围时释放,就在第 27 行之后。
关于c++ - 在 C++ 中新建/删除奇怪的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48580261/