【发布时间】:2012-10-03 23:57:04
【问题描述】:
我正在考虑在我的 qt 工作中开始使用智能指针。这让我感到困惑,智能指针如何与 Qt 垃圾收集一起使用。整个 Qt 都遵循子 QObject 以 QObject* parent 作为 ctor 参数构造的习语,因此可以进行垃圾收集。 例如:
QWidget* mWidget = new QWidget(this);//Here we not only
//ensure that mWidget will be deleted
//when its parent is deleted, but also tell qt,
//that mWidget is not a window, but belongs to
//parent's layout
现在,如果我想将 mWidget 包装到智能指针中。
typedef QScopedPointer<QWidget> WidgPtr;
WidgPtr mWidget = WidgPtr(new QWidget(this));
但是现在当调用 parent 的 dtor 时,它会在 mWidget 的指针上调用 delete 两次。首先是垃圾回收,其次是调用智能指针 dtor。
当然我们可以在没有父级的情况下构造mWidget,然后改变一些标志来关闭窗口行为或调用setParent()(但是mWidget又会被删除两次)。但对我来说,做如此复杂的初始化只是为了能够使用智能指针而不是原始指针,这太过分了。 或者我想念什么? 谢谢。
【问题讨论】:
-
如果
QObject子销毁机制有效,为什么需要智能指针? -
因为智能指针提供了一些超越垃圾收集的优势。例如,如果在删除父小部件之前引发异常,它们可以防止内存泄漏。再举一个例子,它们可以防止指针对象等的意外复制。
-
对象所有权是 NOT 垃圾回收。 Qt 甚至 C++ 中都没有 GC。
标签: c++ qt smart-pointers