前言
智能指针是一种在C++中用于管理动态分配的内存的类。它们封装了原始指针,提供了自动化的内存管理,帮助避免内存泄漏和野指针等常见问题。
C++标准库提供了几种类型的智能指针,主要包括std::unique_ptr、std::shared_ptr和std::weak_ptr。
1. std::unique_ptr
std::unique_ptr 是一种独占所有权的智能指针,保证同一时间只有一个unique_ptr拥有对对象的控制权。当unique_ptr被销毁时,它指向的对象也会被删除。它不能被复制到其他unique_ptr对象,防止多个指针指向同一个资源,但可以通过移动语义(std::move)转移所有权。
使用std::make_unique(C++14及以后版本推荐的方式)或者直接使用unique_ptr的构造函数来创建和初始化unique_ptr。
示例代码:
#include <memory>
// 推荐方式
auto ptr = std::make_unique<int>(10); // 创建一个指向int的unique_ptr,初始化为10
// 使用构造函数
std::unique_ptr<int> uptr(new int(10)); // 创建一个指向int的unique_ptr,初始化为10
2. std::shared_ptr
std::shared_ptr 允许多个shared_ptr实例共享对同一对象的所有权。它使用引用计数机制来跟踪有多少个shared_ptr指向同一个资源,当最后一个shared_ptr被销毁时,资源才会被释放。这种智能指针适用于资源共享的情况。
使用std::make_shared(推荐方式)或shared_ptr的构造函数来创建和初始化shared_ptr。
示例代码:
#include <memory>
auto ptr = std::make_shared<int>(10); // 创建一个指向int的shared_ptr,初始化为10
std::shared_ptr<int> sptr(new int(10)); // 不推荐,但有效
3. std::weak_ptr
std::weak_ptr 是一种不拥有所有权的智能指针,它指向由std::shared_ptr管理的对象。它被设计用来解决std::shared_ptr相互引用时可能导致的循环引用问题,从而避免内存泄漏。
weak_ptr需要被转换成std::shared_ptr来访问资源。
示例代码:
#include <iostream>
#include <memory>
int main() {
std::shared_ptr<int> sharedPtr = std::make_shared<int>(10);
std::weak_ptr<int> weakPtr = sharedPtr; // 创建一个weak_ptr指向sharedPtr管理的对象
// 尝试将weak_ptr转换为shared_ptr
std::shared_ptr<int> sharedPtr2 = weakPtr.lock();
if (sharedPtr2) {
// 转换成功,sharedPtr2不为空
std::cout << "sharedPtr2指向的值: " << *sharedPtr2 << std::endl;
} else {
// 转换失败,sharedPtr2为空
std::cout << "对象已被删除" << std::endl;
}
return 0;
}
weak_ptr需要通过已存在的shared_ptr或另一个weak_ptr来初始化。
示例代码:
#include <memory>
auto sharedPtr = std::make_shared<int>(10); // 首先创建一个shared_ptr
std::weak_ptr<int> weakPtr(sharedPtr); // 通过shared_ptr初始化weak_ptr
总结
C++11引入了std::unique_ptr、std::shared_ptr和std::weak_ptr,以及相关功能,如std::make_shared和后来在C++14中加入的std::make_unique。这些智能指针大大简化了资源管理,特别是内存管理,帮助开发者避免内存泄漏和指针相关的错误。