2011-04-25 73 views
0

我在删除QSA的引用对象时遇到了一些问题。在构造函数中,我写道:QSA的子对象删除问题

QSProject * project = {initialization of QSProject} 
    MyWrapper * wrapper = new MyWrapper; // MyWrapper is QObject's child. It comes without parent here 
    project->addObject(wrapper); 

我在descructor写道:

project->clearObjects(); 
    delete project; 
    delete wrapper; 

此代码原因在段错误析构函数的执行,正是 - 当我试图删除包装。

我做了一些研究,我知道:

  1. QSProject不会删除他的“子对象”,所以这不是一个“双删除”的问题
  2. 如果我不去在构造函数中添加包装到QSProject中,它运行良好。
  3. 如果我不删除在deccructor包装,它运作良好(但内存泄漏)。

这是怎么回事?

+0

只要你知道,你知道QSA已被弃用,并在2008年达到报废?它已被替换为[QtScript](http://doc.qt.nokia.com/latest/qtscript.html)。它可能不适用于你的项目,但我想确保你知道。 – Casey 2011-04-25 16:33:13

回答

0

首先,我对QSA并不熟悉,但考虑到Qt API通常如何工作,QSProject很可能取得了对象的所有权。这意味着QSProject正在使用QObject::setParent()重新对象。

在这种情况下,您正在双重删除该对象。

您是否使用valgrind等工具进行验证,当您忽略删除时,实际上是在泄漏内存?

+0

是的。我已经检查过两次,QSProject不会把孩子带到父母身上,记忆真的会泄漏。 – Arenim 2011-04-26 09:21:05