• 8181阅读
  • 7回复

Qt中的对象释放问题整理 [复制链接]

上一主题 下一主题
离线wvins
 
只看楼主 正序阅读 楼主  发表于: 2009-04-08
有没有什么关于Qt内存释放的文章推荐一下?

我在最近的开发过程中发现Qt的释放有点奇怪。
如果在创建过程中指定了parent,则parent会负责释放该对象,这很合理。

我这边出现了另外一种情况:
    m_treeModel = new TreeModel(m_treeBuilder);
    m_selectionModel = new QItemSelectionModel(m_treeModel);
这里m_selectionModel引用了m_treeModel ,导致最后释放的时候,m_treeModel必须晚于m_selectionModel释放。
---------------
或许这个情况有点特殊,
希望大家要是有看到什么好的关于Qt内存释放的资料,推荐一下。
谢谢先
[ 此帖被wvins在2009-04-09 11:08重新编辑 ]
离线wvins
只看该作者 7楼 发表于: 2009-04-09
又看到一段注释,记录在这里,供后来者参考

void QLayout::addWidget ( QWidget * w )
Adds widget w to this layout in a manner specific to the layout. This function uses addItem().

void QLayout::addItem ( QLayoutItem * item )   [pure virtual]
Note: The ownership of item is transferred to the layout, and it's the layout's responsibility to delete it.

连起来说,就是QLayout会负责组件的删除。
离线kudev
只看该作者 6楼 发表于: 2009-04-09
请看这篇文章,对这个问题有详细的解释,你看了之后如果还有不明白的地方,请提问。

Inside QT Series (十二):Qt对象之间的父子关系
http://www.insideqt.com/bbs/viewthread.php?tid=72
Welcome to http://www.InsideQt.com - 专注于Qt编程!

《Inside Qt Series》专栏文章正在连载中 . . . . . .
离线ferguson442

只看该作者 5楼 发表于: 2009-04-09
楼上的正解
离线318065268
只看该作者 4楼 发表于: 2009-04-09
    m_treeModel = new TreeModel(m_treeBuilder);
    m_selectionModel = new QItemSelectionModel(m_treeModel);
这两句我倒不大愿意深究其实现父子关系是通过引用还是怎样的。我觉得倒是可以按照部件的组成结构理解,如附件中的图所示。
指定了父部件之后,父部件delete掉了子部件跟着也delete掉了,就这样。而delete掉子部件父部件是没有影响的。
Email  rsail@126.com(私人邮箱)
QQ:   318065268
离线tsuibin

只看该作者 3楼 发表于: 2009-04-08
我这么理解的
m_selectionModel使用了 m_treeModel
m_treeModel也就是selectionModel创建条件的一部分
如果你想先释放treeModel
那么创建selectionModel就需要拷贝一个新的treeModel在一个新的内存地址中
这样会浪费更多的内存空间
离线wvins
只看该作者 2楼 发表于: 2009-04-08
你的解释呢,算是个很好的编程规范。
但不是理由,语法上是没有限制对象创建顺序和释放顺序的。
--------------
这个例子的结果很让我意外,
因为m_treeModel并不是交给m_selectionModel管理的,只是存在引用关系,而存在引用关系不能作为删除出错的理由。
个人觉得只有一种可能:
那就是在删除了m_treeModel后,m_selectionModel访问了m_treeModel导致出错。
离线daily

只看该作者 1楼 发表于: 2009-04-08
这个很正常吧创建删除顺序是相反的啊。。。
快速回复
限100 字节
 
上一个 下一个