关于智能指针的再学习与理解。
· 阅读需 11 分钟
本篇文章深入探讨 C++ 中的智能指针,介绍 std::unique_ptr、std::shared_ptr 和 std::weak_ptr 三种常见的智能指针类型,分别讨论它们的特点、使用场景以及常见的内存管理问题。通过代码示例和个人理解,解释了智能指针如何利用 RAII 技术解决手动内存管理中的困扰,如循环引用、悬空指针等问题,最终帮助开发者更高效地管理内存。
前言
C++
的内存管理始终是一个难题,尤其是引入指针后,共享独享与垃圾回收异常困难。
例如下列代码中,三个指针实际上指向同一个MyClass
实例,将ptr
释放后会出现严重的内存问题,此时的ptr
被置为nullptr
,而ptr
1和ptr2
成为悬空指针。
class MyClass
{
public:
MyClass() { std::cout << "MyClass Constructor\n"; }
~MyClass() { std::cout << "MyClass Destructor\n"; }
};
int main()
{
MyClass *ptr = new MyClass(); // 创建一个原始指针
MyClass *ptr2 = ptr; // 复制原始指针
MyClass *ptr3 = ptr; // 复制原始指针
delete ptr; // 释放原始指针
}
因而为了方便的解决内存管理,将指针的使用与RAII技术结合,智能指针诞生了。
RAII的核心思想是通过对象的生命周期来管理资源,确保资源在对象创建时分配,在对象销毁时释放。关于该原则,后续会有相关博客文章,敬请期待!
我始终认为智能指针才应该算是真正意义的指针,脱离内容的指针毫无意义,指针作为指向性质的类型,就应该和其内容共享生命周期。
或者说,智能指针是开发用的,而指针是更为底层的类型。就像Vector和基础数组的关系一样。
核心
目前可用的智能指针共有3种,分别是
std::unique_ptr
std::shared_ptr
std::weak_ptr
std::unique_ptr(独享指针)
std::unique_ptr
是独占所有权的智能指针,同一时间内只有一个指针可以拥有所指对象的所有权。它在对象生命周期结束时自动释放资源