C++ 智能指针是一种用于管理动态内存的机制,能够在程序执行时自动释放内存,从而避免内存泄漏和悬空指针等问题。C++11 引入了三种智能指针:std::unique_ptr
、std::shared_ptr
和 std::weak_ptr
。
- std::unique_ptr :
std::unique_ptr
是独占所有权的智能指针,它确保在任何时候只有一个指针可以指向所管理的对象。- 当
std::unique_ptr
被销毁时,它所管理的对象也会被销毁。 - 不能复制,但可以通过
std::move
进行转移所有权。 - 适用于需要严格所有权管理的情况。
cpp
#include <memory>
std::unique_ptr<int> ptr(new int(10));
- std::shared_ptr :
std::shared_ptr
允许多个指针共享对同一对象的所有权。- 内部使用引用计数,当最后一个
std::shared_ptr
销毁时,所管理的对象才会被释放。 - 支持拷贝构造和赋值操作。
- 适用于需要多个指针共享同一对象的情况。
cpp
#include <memory>
std::shared_ptr<int> ptr1(new int(10));
std::shared_ptr<int> ptr2 = ptr1; // 共享所有权
- std::weak_ptr :
std::weak_ptr
是std::shared_ptr
的弱引用,它不增加引用计数,不影响对象的生命周期。- 主要用于解决
std::shared_ptr
的循环引用问题。 - 可以通过
lock()
方法获取一个指向对象的std::shared_ptr
,用于临时持有对象的引用。
cpp
#include <memory>
std::shared_ptr<int> ptr(new int(10));
std::weak_ptr<int> weakPtr = ptr;
if (auto sharedPtr = weakPtr.lock()) {
// 获取 std::shared_ptr,对象尚未释放
}
智能指针的使用能够提高内存管理的安全性和可靠性,但需要谨慎使用,避免循环引用和内存泄漏等问题。