该程序创建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 release\n";
}
public:
virtual int print()
{
cout<<"a:"<<a<<endl;
return 0;
}
protected:
int a;
int b;
int c;
int arr;
};
int main(void)
{
printf("init stat\n");
getchar();
list<basicClass*> classList;
for (int i = 0; i < 5000000; i++)
{
basicClass *pClass = new basicClass();
classList.push_back(pClass);
}
printf("insert finish\n");
getchar();
unsigned int i = 0;
for (list<basicClass*>::iterator iter = classList.begin(); iter != classList.end(); iter++)
{
i++;
delete *iter;
}
classList.clear();
printf("release finish\n");
printf("release count:%d\n", i);
getchar();
return 0;
}
答案 0 :(得分:1)
许多库创建内存池。也就是说,他们会分配一些内存来满足你的要求,然后当你释放你的记忆时,他们就不会释放自己的记忆。如果做得好,使他们能够更快地满足您的第二次和后续请求。
或者你说你的过程中的居民设置大小继续增加?这是物理上驻留在内存中的页数。通常,您的虚拟内存将等于或大于驻留集大小。
一些内存分配器通过放置&#34;簿记&#34;分配之间的数据结构,通常在链表中。当您删除块时,您的分配器将从该写入读取该特定块的簿记结构。这将导致分页内存块成为驻留。
在这种情况下,内核和您的开发系统存在问题,而不是您可以做很多事情。