Qt:智能指针QScopedPointer使用

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 destructor
     QScopedPointer p(useSubClass ? new MyClass() : new MySubClass);
     QScopedPointer device(handsOverOwnership());

     if (m_value > 3)
         return;

     process(device);
 }

注意:因为拷贝构造和赋值操作私有的,所以不能用作容器的元素。

初始化

每个变量都需要初始化才能够正确使用,官方给的示例较复杂,不符合实际现场,现有三种方式初始化,分别示例如下。

直接初始化:

QScopedPointer g{new Generator()};

同其它变量初始化步骤,直接使用new关键字。

调用reset方法进行初始化:

// 在A处声明智能指针变量。
QScopedPointer auto_generator_;
...
...
...

// 在B处重新对变量auto_generator_进行初始化,变量auto_generator_原来持有的指针被delete。
auto_generator_.reset(new Generator{});

该方法用在已经使用过的智能指针。

你可能感兴趣的:(C,and,C++,Qt,and,Pyside,qt,c++)