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

C++ 内存泄漏:只需创建对象并删除它,程序就会发生内存泄漏,c++,memory-leaks,C++,Memory Leaks,该程序创建5000000个对象,并将这些对象推送到列表中。然后删除这些对象,程序就会出现内存泄漏。我找到了一些关于glibc的信息。它说glibc会导致内存碎片,所以我改用tcmalloc,但它也不能恢复内存 #include <iostream> #include <stdio.h> #include <string.h> #include <list> using namespace std; class basicClass { publi

该程序创建5000000个对象,并将这些对象推送到列表中。然后删除这些对象,程序就会出现内存泄漏。我找到了一些关于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;
}
#包括
#包括
#包括
#包括
使用名称空间std;
类基本类
{
公众:
基本类()
{
a=0;
b=0;
c=0;
}
虚拟~basicClass()
{

//cout许多库创建内存池。也就是说,它们分配一些内存来满足您的请求,然后当您释放内存时,它们不会释放自己的内存。如果操作正确,则可以更快地满足您的第二个和后续请求

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

某些内存分配器的工作方式是在分配之间放置“簿记”数据结构,通常是在链接列表中。当您删除块时,分配器从中读取数据并写入该特定块的簿记结构。这将导致分页出的内存块成为驻留内存块


在这种情况下,这是内核和您的开发系统的问题,而不是您真正可以做的事情。

什么让您相信内存泄漏?您将其陈述为事实,但您有什么证据?所以您的问题是“内存为什么泄漏”?我使用命令“ps-aux | grep a.out”查看内存信息。我在打印“插入完成”和打印“释放完成”后使用此命令,它显示内存没有减少。因此我认为程序出现内存泄漏。可能重复此问题:是的,你是对的。谢谢。我使用“malloc_trim(0)”解决了此问题“。物理内存继续减少,最后可能会耗尽内存。如何解决该程序?您是说进程的常驻集大小继续增加?这是物理驻留在内存中的页数。通常,您的虚拟内存将等于或大于常驻集大小。