• 11491阅读
  • 12回复

[提问]最近在测试QT的内存泄露,发现了不少问题,举个例子。 [复制链接]

上一主题 下一主题
离线tthheedhz
 
只看楼主 倒序阅读 楼主  发表于: 2012-05-26
到底是我的理解错误,还是QT真存在着内存泄露?

例如下面两个例子,非常简单,for循环结束后:
例子一,占用了2.4MB内存;
例子二,占用了3.6MB内存;


之间相差了1MB内存,到底,这1MB内存,用到了什么地方?

例子一和例子二,只是把11和1100000两个数字换位了。


例子一:
int main(int argc,char*argv[])
{
    QApplication app(argc,argv);
    QList<QString>* ls=new QList<QString>();
    for(int j=0;j<1100000;j++)
    {
        for(int i=0;i<11;i++)         {   ls->append(QString::number(i));  }
        ls->clear();
    }
    delete ls;
    return app.exec();
}

例子二:
int main(int argc,char*argv[])
{
    QApplication app(argc,argv);
    QList<QString>* ls=new QList<QString>();
    for(int j=0;j<11;j++)
    {
        for(int i=0;i<1100000;i++)   {    ls->append(QString::number(i));   }
        ls->clear();
    }
    delete ls;
    return app.exec();
}



离线tthheedhz
只看该作者 1楼 发表于: 2012-05-26
之间多出的1MB,属不属于内存泄露?
离线iptton

只看该作者 2楼 发表于: 2012-05-26
“泄露”指的是占用了内存,但程序却没有任何指针指向该块内存。
LZ可以了解下“内存池”概念,感觉应该是内存池的申请及释放机制对两种for嵌套的处理有所不同导致。
[url] http://www.alloyteam.com/2012/05/web-front-end-tool-rythem-1/ [url]
离线tthheedhz
只看该作者 3楼 发表于: 2012-05-26
引用第2楼iptton于2012-05-26 12:32发表的  :
“泄露”指的是占用了内存,但程序却没有任何指针指向该块内存。
LZ可以了解下“内存池”概念,感觉应该是内存池的申请及释放机制对两种for嵌套的处理有所不同导致。


好的。

不过,我的两个例子,只是交换了数字,两个for,变成了两种for?有什么本质上的不同吗?
离线benbenmajia

只看该作者 4楼 发表于: 2012-05-26
int array[10]占用多少内存?
int array[10][10]占用多少内存?
安然.....
离线tthheedhz
只看该作者 5楼 发表于: 2012-05-26
引用第4楼benbenmajia于2012-05-26 17:09发表的  :
int array[10]占用多少内存?
int array[10][10]占用多少内存?

QList的clear()函数,不会释放内存吗?
离线roywillow

只看该作者 6楼 发表于: 2012-05-26
回 5楼(tthheedhz) 的帖子
我想单纯的clear()不一定释放内存,QList是有一些预保留的空间的吧
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线jdwx

只看该作者 7楼 发表于: 2012-05-26
Re:回 5楼(tthheedhz) 的帖子
引用第6楼roywillow于2012-05-26 19:17发表的 回 5楼(tthheedhz) 的帖子 :
我想单纯的clear()不一定释放内存,QList是有一些预保留的空间的吧

这个说的有理,那些STL容器不会一次分配一个成员的内存单元的。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线lovebingheji

只看该作者 8楼 发表于: 2012-05-26
貌似这些应该是C++的概念。。。
离线tthheedhz
只看该作者 9楼 发表于: 2012-05-28
Re:回 5楼(tthheedhz) 的帖子
引用第6楼roywillow于2012-05-26 19:17发表的 回 5楼(tthheedhz) 的帖子 :
我想单纯的clear()不一定释放内存,QList是有一些预保留的空间的吧

  就算clear不释放,那么,delete呢?
delete后,是应该释放的。为什么却没有释放?
离线lrhddzyj
只看该作者 10楼 发表于: 2012-05-28
能够手动释放么?
离线jdwx

只看该作者 11楼 发表于: 2012-05-28
为什么要手动释放呢?
用STL容器就是为了方便,不用自己手写list什么的。
再说现在是什么机器都不缺内存,没必要计较那一点内存。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线roywillow

只看该作者 12楼 发表于: 2012-05-28
如果非要手动释放的话,大概QList::reserve()这个有帮助
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
快速回复
限100 字节
 
上一个 下一个