内存泄漏:只需创建对象并删除它,程序就会发生内存泄漏

Memory leak: just create object and delete it, the program occur memory leak

本文关键字:内存 泄漏 程序 删除 创建对象      更新时间:2023-10-16

该程序创建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;
}

许多库创建内存池。 也就是说,它们分配一些内存来满足您的请求,然后当您释放内存时,它们不会释放自己的内存。 如果做得好,使他们能够更快地满足您的第二次和后续请求。

或者您说您的进程的驻留集大小继续增加? 这是物理驻留在内存中的页数。 通常,您的虚拟内存将等于或大于驻留集大小。

某些内存分配器的工作原理是在分配之间放置"簿记"数据结构,通常在链表中。 当您删除一个块时,您的分配器会从写入该特定块的簿记结构中读取。 这将导致分页的内存块成为驻留的内存块。

在这种情况下,这对内核和你的开发系统来说是一个问题,而不是你能做的。