【问题标题】:Memory leak: just create object and delete it, the program occur memory leak内存泄漏:只要创建对象并删除它,程序就会发生内存泄漏
【发布时间】:2015-02-12 12:18:12
【问题描述】:

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

【问题讨论】:

  • 是什么让您相信存在内存泄漏?你说这是事实,但你有什么证据?
  • 所以你的问题是“为什么内存泄漏”?
  • 我使用命令“ps -aux|grep a.out”查看内存信息。我在打印“插入完成”和打印“释放完成”后使用此命令,它显示内存不' t减少。所以我认为程序发生内存泄漏。
  • 是的,你是对的。谢谢。我通过使用“malloc_trim(0)”来解决它。

标签: c++ memory-leaks


【解决方案1】:

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

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

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

在这种情况下,这对内核和您的开发系统来说是个问题,而实际上您无法做很多事情。

【讨论】:

  • 物理内存不断减少,最后内存可能用完了。程序如何解决?
  • 您是说您的进程的驻留集大小继续增加吗?这是物理上驻留在内存中的页数。一般来说,您的虚拟内存将等于或大于驻留集大小。
猜你喜欢
  • 1970-01-01
  • 2011-02-12
  • 2011-10-13
  • 1970-01-01
  • 2018-06-08
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2012-10-31
相关资源
最近更新 更多