C++11之智能指针unique_ptr
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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?