指针释放的问题

rophie 2013-06-24 08:46:57
请教各位,下面的程序怎么有效的释放指针

class A;
QList<A*> list;
for()
{
A *a=new A();
a->setName("name");
list.append(a);
}
Show(list);
void Show(QList<A*> _list)
{
foreach(A *a,_list)
{
QLabel *label=new QLabel(a->getName(),this);
label->setGeometry(0,0,20,20);
}
}
...全文
122 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ppdayz 2013-06-24
  • 打赏
  • 举报
回复
引用 5 楼 rophie 的回复:

for()
{
  A *a=new A();
  a->setName("name");
  list.append(a);
  a->deleteLater();
}
加上deleteLater()比qDeleteALl(list)有效果
首先,要调用deleteLater,A必须是qobject的派生类 其次,deleteLater只是在事件循环中安排这个对象删除,至于在什么时候删除不是你来决定的,一般是在其parent被删除的时候删除。 而qDeleteAll 是qt推荐的删除含有指针类型的容器的方法: void qDeleteAll ( ForwardIterator begin, ForwardIterator end ) Deletes all the items in the range [begin, end) using the C++ delete operator. The item type must be a pointer type (for example, QWidget *). 这个和 foreach(A *a, list){ delete a; } 是等价的。
rophie 2013-06-24
  • 打赏
  • 举报
回复

for()
{
  A *a=new A();
  a->setName("name");
  list.append(a);
  a->deleteLater();
}
加上deleteLater()比qDeleteALl(list)有效果
rophie 2013-06-24
  • 打赏
  • 举报
回复
引用 3 楼 ppdayz 的回复:
在析构函数中调用 qDeleteALl(list); list.clear(); 就可以了, 或者在析构函数中 foreach(A *a, list){ delete a; } list.clear(); 至于你new出来的label们就不用管他们了 QLabel *label=new QLabel(a->getName(),this); 在new的时候指定了他们的parent是this,在this被删除的时候会被删除的。
如果这个类一直存在,而且会一直重复被调用,不会调用析构函数
ppdayz 2013-06-24
  • 打赏
  • 举报
回复
在析构函数中调用 qDeleteALl(list); list.clear(); 就可以了, 或者在析构函数中 foreach(A *a, list){ delete a; } list.clear(); 至于你new出来的label们就不用管他们了 QLabel *label=new QLabel(a->getName(),this); 在new的时候指定了他们的parent是this,在this被删除的时候会被删除的。
rophie 2013-06-24
  • 打赏
  • 举报
回复
引用 1 楼 zhxianbin 的回复:
A *a=new A(); 放入构造函数,析构函数中 delete
什么意思
zhxianbin 2013-06-24
  • 打赏
  • 举报
回复
A *a=new A(); 放入构造函数,析构函数中 delete

16,212

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧