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{});
该方法用在已经使用过的智能指针。