• 22819阅读
  • 12回复

[提问]QList    的clear() 是完全释放内存吗 [复制链接]

上一主题 下一主题
离线vcvbve
 
只看楼主 倒序阅读 楼主  发表于: 2013-01-21
QList    的clear() 是完全释放内存吗,调试断点总觉得没有完全释放,请教大家
离线jdwx

只看该作者 1楼 发表于: 2013-01-21
回 楼主(vcvbve) 的帖子
应该相信Qt不会出这么低级的错误。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线kimtaikee

只看该作者 2楼 发表于: 2013-01-21
Re:QList的clear() 是完全释放内存吗
那得看你这里面放的是什么对象,如果是在stack上分配的话clear之后就会自动释放,如果是在heap上分配的话就得先
  1. qDeleteAll(list);
  2. list.clear();

离线vcvbve
只看该作者 3楼 发表于: 2013-01-22
回 2楼(kimtaikee) 的帖子
谢谢你的帮助,我还有几个问题想请教一下。
如果在栈中分配的话,在不超过内存大小的情况下,Qlist.size()的大小是否有限制?
如果将超过内存,qt会将剩余的自动分配到堆上,还是直接程序溢出?
当我执行list.clear()时,程序会在执行完这条语句之后立刻释放内存吗?


谢谢大家啊
离线呆呆很呆
只看该作者 4楼 发表于: 2013-01-22
回 3楼(vcvbve) 的帖子
查源码吧
离线realfan

只看该作者 5楼 发表于: 2013-01-23
回 3楼(vcvbve) 的帖子
Qlist.size()的大小肯定是有限制的,数字计算机一切类型都是有限集。但对于实际应用,基本当作没有限制用。
我印象中,QList的元素是放在堆中的。QList会自己释放元素本身占的内存。
但如果元素是指针,指针指向一块内存,那这块内存要你自己管理。QList只管元素本身,即那个指针。

离线vcvbve
只看该作者 6楼 发表于: 2013-01-24
Re:QList的clear() 是完全释放内存吗
,
我测的是,执行QList.clear()时,程序的内存是不会立即释放的。
不知道Qt是如何处理回收的,当不断打开子窗口,内存会一点点的增加,当不做动作时,也会一点点下降。查了两天天也没发现有内存泄露的地方。
界面真纠结,Qt真纠结。
离线呆呆很呆
只看该作者 7楼 发表于: 2013-01-24
回 5楼(realfan) 的帖子
不见得,我去查Qt源码了,QList::append最终调用了QListData::append(1);
上此函数定义
  1. void **QListData::append(int n)
  2. {
  3.     Q_ASSERT(!d->ref.isShared());
  4.     int e = d->end;
  5.     if (e + n > d->alloc) {
  6.         int b = d->begin;
  7.         if (b - n >= 2 * d->alloc / 3) {
  8.             // we have enough space. Just not at the end -> move it.
  9.             e -= b;
  10.             ::memcpy(d->array, d->array + b, e * sizeof(void *));
  11.             d->begin = 0;
  12.         } else {
  13.             realloc(grow(d->alloc + n));
  14.         }
  15.     }
  16.     d->end = e + n;
  17.     return d->array + e;
  18. }
内存不够的情况直接调用了realloc函数 对标准库了解不深 莫非这个函数有限制内存大小?

离线呆呆很呆
只看该作者 8楼 发表于: 2013-01-24
回 3楼(vcvbve) 的帖子
应该是立即销毁
clear调用了operator= 然后创建空的temp 交换d指针 接着temp退出作用域
调用node_destruct(Node *from,Node *to)销毁每一个数据
离线roywillow

只看该作者 9楼 发表于: 2013-01-24
回 6楼(vcvbve) 的帖子
我记得QList为了防止频繁的重新申请内存释放内存,会为自己预留一部分空间的,否则每添加一个数据就要移动一次内存中的数据,岂不是很影响效率?我想这就是clear不会立刻释放内存的原因
这个预留的空间好像可以通过自己调用reserve()来手动设定的
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线呆呆很呆
只看该作者 10楼 发表于: 2013-01-25
回 9楼(roywillow) 的帖子
对啊 grow函数调用了qAllocMore 于是多分配了内存 可是在销毁时的确是free了那段内存
离线realfan

只看该作者 11楼 发表于: 2013-01-28
Re:QList的clear() 是完全释放内存吗
反正就一点,QList中的每个元素本身所占的内存,QList会管理的,不用我们去操心了。
离线vcvbve
只看该作者 12楼 发表于: 2013-01-29
回 9楼(roywillow) 的帖子
看现象的话,确实像你说的这样,也许Qt确实是为了效率而不会立即释放QList的空间。我在程序中查询并显示10万条数据,关闭这个界面后,程序占用内存比查询之前会多几M,有时7、8M,有时2、4M,不确定。这几M也会一点点慢慢减少,但不会减到0,回到最初的内存占用大小。      
这带来一个问题就是,也许我这种查询操作并不频繁,但多操作几次的话,它会占用内存,从而影响其它的运行效率。好吧,其实最关键的影响是领导以为你这是不是在内存泄露,添加不到版本中去,
快速回复
限100 字节
 
上一个 下一个