📜  unique_ptr 语法 - C++ (1)

📅  最后修改于: 2023-12-03 14:48:11.067000             🧑  作者: Mango

unique_ptr 语法 - C++

在C++11中,unique_ptr是一个聪明的指针类,它允许使用动态分配的对象而不必担心内存泄漏。

使用unique_ptr

定义一个unique_ptr变量:

std::unique_ptr<int> ptr(new int);

在以上例子中,定义了一个unique_ptr对象指向一个int类型对象,并将它初始化为new int返回的指针。必须使用new来分配空间,并将指针传递给unique_ptr构造函数。

可以使用reset()来释放unique_ptr:

std::unique_ptr<int> ptr(new int);
ptr.reset(); // ptr释放指向的int对象内存

也可以在unique_ptr生命周期的任何时候将指针赋值给它:

std::unique_ptr<int> ptr1(new int);
std::unique_ptr<int> ptr2;

ptr2 = std::move(ptr1); // ptr2现在拥有ptr1之前持有的int对象内存

在以上例子中,我们使用std::move()将ptr1的所有权转移到ptr2中。

继承类中的unique_ptr

unique_ptr也可以在继承关系树中被使用。在继承关系树中定义unique_ptr对象时需要注意以下几点:

  1. unique_ptr必须指向父类类型;
  2. 派生类需要提供父类unique_ptr的拷贝构造函数;
  3. 派生类的unique_ptr需要自己定义构造函数和析构函数。

以下是一个派生类中使用unique_ptr的例子:

class Base {
public:
    virtual ~Base() {}
};

class Derived : public Base {
private:
    std::unique_ptr<int> ptr;
public:
    Derived() : ptr(new int) {}
    Derived(Derived& other) : ptr(new int(*other.ptr)) {}
    ~Derived() override {}
};

在以上例子中,派生类Derived包含了一个unique_ptr,指向一个int类型的对象。注意,Derived类提供了一个拷贝构造函数来复制基类unique_ptr所拥有的int对象指针。Derived也需要自己定义析构函数来释放它所拥有的int对象的内存。

总结

unique_ptr是C++11中引入的一个聪明的指针类,它允许使用动态分配的对象而不必担心内存泄漏。unique_ptr也可以在继承关系树中使用,但是需要继承派生类定义构造函数和析构函数,以确保对象安全释放。