std::unique_ptr
是 C++ 标准库中的智能指针类,用于管理动态分配的对象。它提供了独占式拥有权,即在任何时候只能有一个 std::unique_ptr
拥有对对象的唯一所有权。当 std::unique_ptr
被销毁或重置时,它会自动删除所管理的对象,从而避免内存泄漏。
std::unique_ptr
的主要特点和用法如下:
-
独占式所有权:一个
std::unique_ptr
实例拥有对对象的唯一所有权,不能拷贝或共享所有权。这意味着只能有一个std::unique_ptr
实例指向同一个对象,从而避免了资源的多重释放和访问冲突。 -
托管动态分配的对象:
std::unique_ptr
主要用于托管通过new
或std::make_unique
动态分配的对象。它可以管理任何可删除的对象,包括基本类型、自定义类型和数组等。 -
自动释放资源:当
std::unique_ptr
被销毁或重置时,它会自动调用所管理对象的析构函数,并释放对象所占用的内存。这消除了手动管理资源释放的需求,提高了代码的可靠性和安全性。 -
移动语义:
std::unique_ptr
支持移动语义,可以通过移动构造函数和移动赋值运算符将所有权从一个std::unique_ptr
实例转移给另一个实例,从而避免不必要的对象拷贝和资源释放。
一、unique_ptr初始化
#include <iostream> #include <memory> class UniquePtr { public: UniquePtr() { std::cout << "调用构造函数" << std::endl; } ~UniquePtr() { std::cout << "调用析构函数" << std::endl; } void print() { std::cout << "调用print()函数" << std::endl; } }; int main() { std::unique_ptr<UniquePtr> ptr(new UniquePtr()); ptr->print(); return 0; }
二、无法进行复制构造和赋值操作
int main() { std::unique_ptr<UniquePtr> ptr(new UniquePtr()); std::unique_ptr<UniquePtr> ptr1(ptr); //报错 std::unique_ptr<UniquePtr> ptr2 = ptr; //报错 return 0; }
三、可以进行移动构造和移动赋值操作
unique_ptr虽然没有拷贝和赋值操作,但却提供了一种移动机制来将指针的所有权从一个unique_ptr转移给另一个unique_ptr。如果需要转移所有权,可以使用std::move()函数。
int main() { std::unique_ptr<UniquePtr> ptr(new UniquePtr()); std::unique_ptr<UniquePtr> ptr2 = std::move(ptr); //转移所有权 std::unique_ptr<UniquePtr> ptr3(std::move(ptr)); return 0; }
四、可以通过函数返回值返回unique_ptr
#include <iostream> #include <memory> class UniquePtr { public: UniquePtr() { std::cout << "调用构造函数" << std::endl; } ~UniquePtr() { std::cout << "调用析构函数" << std::endl; } void print() { std::cout << "调用print()函数" << std::endl; } }; std::unique_ptr<UniquePtr> return_unique_ptr() { std::unique_ptr<UniquePtr> ptr(new UniquePtr()); return ptr; } int main() { std::unique_ptr<UniquePtr> ptr = return_unique_ptr(); return 0; }