我開始在我的qt工作中開始使用智能指針。讓我困惑的是,智能指針如何與Qt垃圾回收一起使用。整個Qt站在孩子QObject與QObject * parent構造成ctor參數的習慣用法上,因此可以實現垃圾收集。 例如:qt垃圾回收和智能指針
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'子破壞機制有效,爲什麼你需要智能指針? – cmannett85
由於智能指針提供了垃圾收集的一些優點。例如,如果在刪除父窗口部件之前引發異常,它們將防止內存泄漏。另一個例子是它們可以防止指針對象的意外複製等。 – Alexander
對象所有權是* NOT *垃圾回收。 Qt中沒有GC,甚至沒有C++。 –