内存泄漏:只需创建对象并删除它,程序就会发生内存泄漏
Memory leak: just create object and delete it, the program occur memory leak
该程序创建5,000,000个对象并将对象推送到列表中。然后,它会删除对象,程序会遭受内存泄漏。我找到了一些关于glibc的信息。它说glibc会导致内存碎片,所以我用tcmalloc代替,但它也不能恢复内存。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <list>
using namespace std;
class basicClass
{
public:
basicClass()
{
a = 0;
b = 0;
c = 0;
}
virtual ~basicClass()
{
// cout<<"basic class releasen";
}
public:
virtual int print()
{
cout<<"a:"<<a<<endl;
return 0;
}
protected:
int a;
int b;
int c;
int arr;
};
int main(void)
{
printf("init statn");
getchar();
list<basicClass*> classList;
for (int i = 0; i < 5000000; i++)
{
basicClass *pClass = new basicClass();
classList.push_back(pClass);
}
printf("insert finishn");
getchar();
unsigned int i = 0;
for (list<basicClass*>::iterator iter = classList.begin(); iter != classList.end(); iter++)
{
i++;
delete *iter;
}
classList.clear();
printf("release finishn");
printf("release count:%dn", i);
getchar();
return 0;
}
许多库创建内存池。 也就是说,它们分配一些内存来满足您的请求,然后当您释放内存时,它们不会释放自己的内存。 如果做得好,使他们能够更快地满足您的第二次和后续请求。
或者您说您的进程的驻留集大小继续增加? 这是物理驻留在内存中的页数。 通常,您的虚拟内存将等于或大于驻留集大小。
某些内存分配器的工作原理是在分配之间放置"簿记"数据结构,通常在链表中。 当您删除一个块时,您的分配器会从写入该特定块的簿记结构中读取。 这将导致分页的内存块成为驻留的内存块。
在这种情况下,这对内核和你的开发系统来说是一个问题,而不是你能做的。
相关文章:
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 尽管遵循了规则,内存泄漏在哪里
- 为什么调用堆栈数组会导致内存泄漏
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 使用模板类的自定义列表类型中的内存泄漏
- 为什么以下C++代码中存在内存泄漏?
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 我是否生成线程并导致内存泄漏?
- 多线程程序中出现意外的内存泄漏
- 为什么此函数会导致内存泄漏?
- 在 C++ 库中使用cythonized python时内存泄漏
- 需要帮助查找内存泄漏
- 瓦尔格林德的内存泄漏使用新的
- 无法找出我的代码中的内存泄漏
- C++ 结构内部的unordered_map会导致内存泄漏问题吗?
- 可视化 使用 VS Code 查找C++应用程序中的内存泄漏
- Shared_ptr双链接列表内存泄漏
- C++ 在类中使用常量引用文本时 O2 内存泄漏