QSA的子对象删除问题

时间:2011-04-25 13:44:12

标签: c++ qt 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. 如果我不在descructor中删除包装器,它运行良好(但内存泄漏)。
  4. 怎么了?

1 个答案:

答案 0 :(得分:0)

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

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

您是否使用诸如valgrind之类的工具验证了当您省略删除时实际上是在泄漏内存?