[英]Strange Memory leak by new/delete in C++
以下是我的问题和代码:
我知道这不是使用这么多小内存块的常规方法,但是我很想知道原因。
我已经使用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,释放内存并停止,检查内存资源:
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_ptr
或std::unique_ptr
类的智能指针 (您可以在Google上搜索其信息)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.