0

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

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

我在析构函数中写道:

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

这段代码导致在析构函数的执行中出现段错误,确切地说——当我试图删除包装器时。

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

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

这是怎么回事?

4

1 回答 1

0

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

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

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

于 2011-04-25T16:35:17.720 回答