智能指针与RAII
一、智能指针 (Smart Pointers)
注意
博客关于智能指针的再学习与理解。有着更完整的知识点与理解,建立优先学习博客内容。
1. 定义
智能指针是一种用于管理动态分配内存的对象,它能够自动释放所指向的内存,从而减少内存泄漏的风险。智能指针可以认为是对指针的封装,提供了与指针相同的方法。
智能指针的本质是在封装与栈,还可以认为是RAII的一种实现 。即完全离开作用域触发GC。
2. 类型
智能指针主要有以下几种类型:
std::unique_ptr
:- 表示独占所有权的智能指针。
- 不能被复制,只能移动。
- 当
std::unique_ptr
超出作用域时,所管理的内存会自动释放。
std::unique_ptr<int> ptr(new int(5)); // 创建一个unique_ptr
std::unique_ptr<int> ptr1 = std::move(ptr1); // 转移所有权
std::shared_ptr
:- 表示共享所有权的智能指针。
- 允许多个指针共享同一内存资源。
- 使用引用计数来跟踪指向同一内存的智能指针数量,当引用计数归零时,内存自动释放。
std::shared_ptr<int> ptr1(new int(5)); // 创建一个shared_ptr
std::shared_ptr<int> ptr2 = ptr1; // ptr1 和 ptr2 共享同一内存
std::weak_ptr
:- 与
std::shared_ptr
结合使用,提供对共享资源的非拥有引用。 - 防止循环引用导致的内存泄漏。
- 与
std::shared_ptr<int> ptr1(new int(5)); // 创建一个shared_ptr
std::shared_ptr<int> ptr2 = ptr1; // ptr1 和 ptr2 共享同一内存
std::weak_ptr<int> weakPtr = ptr1; // 创建一个weak_ptr,不增加引用计数