QScopedPointer和C++中的智能指針std::unique_ptr其概念是一樣的,它包裝了new操作符在堆上分配的動態對象,能夠保證動態創建的對象在任何時候都可以被正確地刪除。但它有更嚴格的所有權,并且不能轉讓,一旦獲取了對象的管理權,你就無法再從它那里取回來。也就是說,只要出了作用域,指針就會被自動刪除,因為它的拷貝構造和賦值操作都是私有的,與QObject及其派生類風格相同。
QScopedPointer官方示例
沒有使用智能指針:
void myFunction(bool useSubClass)
{MyClass *p = useSubClass ? new MyClass() : new MySubClass;QIODevice *device = handsOverOwnership();if (m_value > 3) {delete p;delete device;return;}try {process(device);}catch (...) {delete p;delete device;throw;}delete p;delete device;
}
使用智能指針QScopedPointer:
void myFunction(bool useSubClass){// assuming that MyClass has a virtual destructorQScopedPointer<MyClass> p(useSubClass ? new MyClass() : new MySubClass);QScopedPointer<QIODevice> device(handsOverOwnership());if (m_value > 3)return;process(device);}
注意:因為拷貝構造和賦值操作私有的,所以不能用作容器的元素。
初始化
每個變量都需要初始化才能夠正確使用,官方給的示例較復雜,不符合實際現場,現有三種方式初始化,分別示例如下。
直接初始化:
QScopedPointer<Generator> g{new Generator()};
同其它變量初始化步驟,直接使用new關鍵字。
調用reset方法進行初始化:
// 在A處聲明智能指針變量。
QScopedPointer<Generator> auto_generator_;
...
...
...// 在B處重新對變量auto_generator_進行初始化,變量auto_generator_原來持有的指針被delete。
auto_generator_.reset(new Generator{});
該方法用在已經使用過的智能指針。