C++11智能指针(上):理解与基础用法
智能指针的诞生背景
C++11引入智能指针的主要目的是解决传统裸指针(raw pointer)的内存管理问题。裸指针需要手动管理内存分配与释放,容易导致内存泄漏或重复释放等问题。智能指针通过自动化的内存管理机制,显著提升了代码的安全性和可维护性。
智能指针的核心类型
C++11标准库提供了三种主要的智能指针模板类:std::unique_ptr、std::shared_ptr和std::weak_ptr。它们均定义在<memory>头文件中,具有不同的所有权语义和使用场景。
unique_ptr:独占所有权指针
std::unique_ptr实现了独占式所有权模型,同一时刻只能有一个unique_ptr指向特定对象。当unique_ptr被销毁时,其所占有的对象也会自动被销毁。
std::unique_ptr<int> ptr(new int(42)); // 创建独占指针
// std::unique_ptr<int> ptr2 = ptr; // 错误:不允许复制
std::unique_ptr<int> ptr2 = std::move(ptr); // 允许所有权转移
使用make_unique(C++14引入)可以更安全地创建unique_ptr:
auto ptr = std::make_unique<int>(42); // 推荐用法
shared_ptr:共享所有权指针
std::shared_ptr通过引用计数实现共享所有权,多个shared_ptr可以指向同一个对象。当最后一个shared_ptr被销毁时,对象才会被释放。
std::shared_ptr<int> ptr1(new int(42)); // 创建共享指针
std::shared_ptr<int> ptr2 = ptr1; // 合法:引用计数增加
推荐使用make_shared创建:
auto ptr = std::make_shared<int>(42); // 更高效的内存分配
weak_ptr:弱引用指针
std::weak_ptr是shared_ptr的配套工具,它不增加引用计数,主要用于解决shared_ptr的循环引用问题。需要通过lock()方法获取可用的shared_ptr。
std::shared_ptr<int> sp = std::make_shared<int>(42);
std::weak_ptr<int> wp = sp; // 创建弱引用
if (auto tmp = wp.lock()) { // 尝试提升为shared_ptr
// 使用tmp访问对象
}
智能指针的内存管理机制
所有智能指针都遵循RAII(Resource Acquisition Is Initialization)原则。在构造函数中获取资源,在析构函数中释放资源。unique_ptr默认使用delete释放资源,shared_ptr可自定义删除器:
// 自定义删除器示例
auto deleter = [](FILE* fp) { fclose(fp); };
std::unique_ptr<FILE, decltype(deleter)> fp(fopen("test.txt", "r"), deleter);
选择适当的智能指针
- 优先使用
unique_ptr:默认选择,性能开销最小 - 需要共享所有权时用
shared_ptr - 解决循环引用问题用
weak_ptr - 避免混合使用裸指针和智能指针
典型错误用法示例
int* raw_ptr = new int(42);
std::shared_ptr<int> sp1(raw_ptr);
std::shared_ptr<int> sp2(raw_ptr); // 错误:会导致重复释放
正确做法是始终让智能指针管理裸指针,不直接使用裸指针。
性能考量
智能指针会带来少量运行时开销:
unique_ptr几乎没有额外开销shared_ptr需要维护引用计数weak_ptr需要在提升时检查引用计数
在性能关键代码中应谨慎评估使用代价。

被折叠的 条评论
为什么被折叠?



