新浪微博
腾讯微博
会员列表
统计排行
基本信息
到访IP统计
管理团队
管理统计
在线会员
会员排行
版块排行
帖子排行
标签排行
帮助
下拉
用户名
电子邮箱
用户名
密 码
记住登录
登录
找回密码
注册
快捷通道
关闭
您还没有登录,快捷通道只有在登录后才能使用。
立即登录
还没有帐号? 赶紧
注册一个
首页
论坛
Qt下载
作品展
群组
个人中心
捐赠、管理与开发
邮件订阅
帖子
文章
日志
用户
版块
群组
帖子
搜索
QTCN开发网
>
Qt基础编程
>
QList 的clear() 是完全释放内存吗
发帖
回复
返回列表
新帖
22819
阅读
12
回复
[提问]
QList 的clear() 是完全释放内存吗
[复制链接]
上一主题
下一主题
离线
vcvbve
UID:138784
注册时间
2012-11-27
最后登录
2013-02-22
在线时间
17小时
发帖
4
搜Ta的帖子
精华
0
金钱
140
威望
24
贡献值
10
好评度
14
访问TA的空间
加好友
用道具
新手上路
关闭
个人中心可以申请新版勋章哦
立即申请
知道了
加关注
发消息
只看楼主
倒序阅读
楼主
发表于: 2013-01-21
QList 的clear() 是完全
释放
内存吗,调试断点总觉得
没有
完全释放,请教大家
共
条评分
回复
举报
分享到
淘江湖
新浪
QQ微博
QQ空间
开心
人人
豆瓣
网易微博
百度
鲜果
白社会
飞信
离线
jdwx
UID:107742
注册时间
2010-11-12
最后登录
2016-02-01
在线时间
4619小时
发帖
2939
搜Ta的帖子
精华
0
金钱
30465
威望
3015
贡献值
0
好评度
3005
访问TA的空间
加好友
用道具
论坛版主
加关注
发消息
只看该作者
1楼
发表于: 2013-01-21
回 楼主(vcvbve) 的帖子
应该相信Qt不会出这么低级的错误。
共
条评分
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
回复
举报
离线
kimtaikee
UID:77767
注册时间
2009-04-15
最后登录
2025-01-22
在线时间
3553小时
发帖
1296
搜Ta的帖子
精华
2
金钱
26976
威望
2027
贡献值
4
好评度
2014
访问TA的空间
加好友
用道具
内测会员
加关注
发消息
只看该作者
2楼
发表于: 2013-01-21
Re:QList的clear() 是完全释放内存吗
那得看你这里面放的是什么对象,如果是在stack上分配的话clear之后就会自动释放,如果是在heap上分配的话就得先
复制代码
qDeleteAll(list);
list.clear();
共
条评分
回复
举报
离线
vcvbve
UID:138784
注册时间
2012-11-27
最后登录
2013-02-22
在线时间
17小时
发帖
4
搜Ta的帖子
精华
0
金钱
140
威望
24
贡献值
10
好评度
14
访问TA的空间
加好友
用道具
新手上路
加关注
发消息
只看该作者
3楼
发表于: 2013-01-22
回 2楼(kimtaikee) 的帖子
谢谢你的帮助,我还有几个问题想请教一下。
如果在栈中分配的话,在不超过内存大小的情况下,Qlist.size()的大小是否有限制?
如果将超过内存,qt会将剩余的自动分配到堆上,还是直接程序溢出?
当我执行list.clear()时,程序会在执行完这条语句之后立刻释放内存吗?
谢谢大家啊
共
条评分
回复
举报
离线
呆呆很呆
UID:120998
注册时间
2011-08-18
最后登录
2013-09-28
在线时间
268小时
发帖
322
搜Ta的帖子
精华
0
金钱
3365
威望
344
贡献值
0
好评度
334
访问TA的空间
加好友
用道具
骑士
加关注
发消息
只看该作者
4楼
发表于: 2013-01-22
回 3楼(vcvbve) 的帖子
查源码吧
共
条评分
回复
举报
离线
realfan
UID:123401
注册时间
2011-10-20
最后登录
2025-02-11
在线时间
1949小时
发帖
1495
搜Ta的帖子
精华
19
金钱
42344
威望
1583
贡献值
11
好评度
1569
访问TA的空间
加好友
用道具
论坛版主
加关注
发消息
只看该作者
5楼
发表于: 2013-01-23
回 3楼(vcvbve) 的帖子
Qlist.size()的大小肯定是有限制的,数字计算机一切类型都是有限集。但对于实际应用,基本当作没有限制用。
我印象中,QList的元素是放在堆中的。QList会自己释放元素本身占的内存。
但如果元素是指针,指针指向一块内存,那这块内存要你自己管理。QList只管元素本身,即那个指针。
共
条评分
回复
举报
离线
vcvbve
UID:138784
注册时间
2012-11-27
最后登录
2013-02-22
在线时间
17小时
发帖
4
搜Ta的帖子
精华
0
金钱
140
威望
24
贡献值
10
好评度
14
访问TA的空间
加好友
用道具
新手上路
加关注
发消息
只看该作者
6楼
发表于: 2013-01-24
Re:QList的clear() 是完全释放内存吗
,
我测的是,执行QList.clear()时,程序的内存是不会立即释放的。
不知道Qt是如何处理回收的,当不断打开子窗口,内存会一点点的增加,当不做动作时,也会一点点下降。查了两天天也没发现有内存泄露的地方。
界面真纠结,Qt真纠结。
共
条评分
回复
举报
离线
呆呆很呆
UID:120998
注册时间
2011-08-18
最后登录
2013-09-28
在线时间
268小时
发帖
322
搜Ta的帖子
精华
0
金钱
3365
威望
344
贡献值
0
好评度
334
访问TA的空间
加好友
用道具
骑士
加关注
发消息
只看该作者
7楼
发表于: 2013-01-24
回 5楼(realfan) 的帖子
不见得,我去查Qt源码了,QList::append最终调用了QListData::append(1);
上此函数定义
复制代码
void **QListData::append(int n)
{
Q_ASSERT(!d->ref.isShared());
int e = d->end;
if (e + n > d->alloc) {
int b = d->begin;
if (b - n >= 2 * d->alloc / 3) {
// we have enough space. Just not at the end -> move it.
e -= b;
::memcpy(d->array, d->array + b, e * sizeof(void *));
d->begin = 0;
} else {
realloc(grow(d->alloc + n));
}
}
d->end = e + n;
return d->array + e;
}
内存不够的情况直接调用了realloc函数 对标准库了解不深 莫非这个函数有限制内存大小?
共
条评分
回复
举报
离线
呆呆很呆
UID:120998
注册时间
2011-08-18
最后登录
2013-09-28
在线时间
268小时
发帖
322
搜Ta的帖子
精华
0
金钱
3365
威望
344
贡献值
0
好评度
334
访问TA的空间
加好友
用道具
骑士
加关注
发消息
只看该作者
8楼
发表于: 2013-01-24
回 3楼(vcvbve) 的帖子
应该是立即销毁
clear调用了operator= 然后创建空的temp 交换d指针 接着temp退出作用域
调用node_destruct(Node *from,Node *to)销毁每一个数据
共
条评分
回复
举报
离线
roywillow
UID:97396
注册时间
2010-05-15
最后登录
2021-09-20
在线时间
5071小时
发帖
2897
搜Ta的帖子
精华
5
金钱
29175
威望
2924
贡献值
2
好评度
2916
访问TA的空间
加好友
用道具
精灵王
加关注
发消息
只看该作者
9楼
发表于: 2013-01-24
回 6楼(vcvbve) 的帖子
我记得QList为了防止频繁的重新申请内存释放内存,会为自己预留一部分空间的,否则每添加一个数据就要移动一次内存中的数据,岂不是很影响效率?我想这就是clear不会立刻释放内存的原因
这个预留的空间好像可以通过自己调用reserve()来手动设定的
共
条评分
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
回复
举报
离线
呆呆很呆
UID:120998
注册时间
2011-08-18
最后登录
2013-09-28
在线时间
268小时
发帖
322
搜Ta的帖子
精华
0
金钱
3365
威望
344
贡献值
0
好评度
334
访问TA的空间
加好友
用道具
骑士
加关注
发消息
只看该作者
10楼
发表于: 2013-01-25
回 9楼(roywillow) 的帖子
对啊 grow函数调用了qAllocMore 于是多分配了内存 可是在销毁时的确是free了那段内存
共
条评分
回复
举报
离线
realfan
UID:123401
注册时间
2011-10-20
最后登录
2025-02-11
在线时间
1949小时
发帖
1495
搜Ta的帖子
精华
19
金钱
42344
威望
1583
贡献值
11
好评度
1569
访问TA的空间
加好友
用道具
论坛版主
加关注
发消息
只看该作者
11楼
发表于: 2013-01-28
Re:QList的clear() 是完全释放内存吗
反正就一点,QList中的
每个元素本身
所占的内存,QList会管理的,不用我们去操心了。
共
条评分
回复
举报
离线
vcvbve
UID:138784
注册时间
2012-11-27
最后登录
2013-02-22
在线时间
17小时
发帖
4
搜Ta的帖子
精华
0
金钱
140
威望
24
贡献值
10
好评度
14
访问TA的空间
加好友
用道具
新手上路
加关注
发消息
只看该作者
12楼
发表于: 2013-01-29
回 9楼(roywillow) 的帖子
看现象的话,确实像你说的这样,也许Qt确实是为了效率而不会立即释放QList的空间。我在程序中查询并显示10万条数据,关闭这个界面后,程序占用内存比查询之前会多几M,有时7、8M,有时2、4M,不确定。这几M也会一点点慢慢减少,但不会减到0,回到最初的内存占用大小。
这带来一个问题就是,也许我这种查询操作并不频繁,但多操作几次的话,它会占用内存,从而影响其它的运行效率。好吧,其实最关键的影响是领导以为你这是不是在内存泄露,添加不到版本中去,
共
条评分
回复
举报
发帖
回复
返回列表
http://www.qtcn.org/bbs
访问内容超出本站范围,不能确定是否安全
继续访问
取消访问
快速回复
限100 字节
您目前还是游客,请
登录
或
注册
进入高级模式
文字颜色
发 布
回复后跳转到最后一页
上一个
下一个
关闭
补充发布信息
验证码:
发 布
隐藏
快速跳转
站务及资讯
网站公告
新闻资讯
Qt官方发布
网站管理
Qt应用及资源
Qt 作品展
Qt代码秀
Qt应用版
Qt技术讨论区
Qt安装与发布
Qt中文处理
Qt基础编程
Qt QML开发
Qt嵌入式开发
Qt移动平台开发
其它技术开发讨论区
Qt图书专区
《C++ GUI Qt 4编程》(第2版)专栏
《Qt高级编程》专栏
《零基础学Qt4编程》专栏
《Qt设计模式》(第2版) 图书专栏
Python Qt GUI快速编程
Qt项目开发区
天池项目
Qt开放平台开发库
机械CAD
扇贝词典
非活跃项目区
社区中心
帖子回收站(Trash)
招聘、求职、供求、广告等
休闲娱乐
关闭
关闭
选中
1
篇
全选