智能指针是 C++ 中用于自动管理动态分配内存的工具,主要有三种类型:std::unique_ptr
、std::shared_ptr
和 std::weak_ptr
。下面是如何创建和使用这些智能指针的详细说明:
1. std::unique_ptr
-
用途:
std::unique_ptr
是一种独占式智能指针,确保指向的对象在同一时间只能被一个指针拥有。它在作用域结束时自动释放其管理的对象。 -
创建:
#include <memory> std::unique_ptr<int> ptr1 = std::make_unique<int>(10); // 创建并初始化
-
使用:
if (ptr1) { std::cout << *ptr1 << std::endl; // 输出 10 }
-
注意:
std::unique_ptr
不支持复制,但支持移动:std::unique_ptr<int> ptr2 = std::move(ptr1); // ptr1 现在为空,ptr2 拥有对象
2. std::shared_ptr
-
用途:
std::shared_ptr
允许多个指针共同拥有同一个对象,通过引用计数来管理对象的生命周期。只要有shared_ptr
指向对象,它就不会被释放。 -
创建:
#include <memory> std::shared_ptr<int> ptr3 = std::make_shared<int>(20); // 创建并初始化
-
使用:
std::cout << *ptr3 << std::endl; // 输出 20
-
引用计数:当
shared_ptr
被复制时,会增加引用计数,当最后一个shared_ptr
被销毁或重置时,管理的对象才会被释放。
3. std::weak_ptr
-
用途:
std::weak_ptr
用于解决shared_ptr
的循环引用问题。它不会增加引用计数,只是对shared_ptr
的弱引用。当需要访问对象时,可以将weak_ptr
升级为shared_ptr
。 -
创建:
#include <memory> std::weak_ptr<int> weakPtr = ptr3; // 指向一个 shared_ptr,但不增加引用计数
-
使用:
if (auto sharedPtr = weakPtr.lock()) { // 尝试升级为 shared_ptr std::cout << *sharedPtr << std::endl; // 如果成功,输出 20 } else { std::cout << "Object has been deleted." << std::endl; }
总结
std::unique_ptr
用于独占管理,确保内存的唯一所有权。std::shared_ptr
用于共享所有权,适合多个地方需要访问同一个对象的场景。std::weak_ptr
用于避免循环引用的情况,提供对shared_ptr
的非拥有性访问。
使用智能指针可以大大减少内存泄漏和错误管理内存的风险,是现代 C++ 编程的重要部分。
标签:std,创建,weak,智能,shared,unique,ptr,指针 From: https://www.cnblogs.com/niumachen/p/18452110