Table of Contents
#custom-toc-container
C++的智能指针
# 简介 当我们`new`分配内存时,通常需要在合适的地方`delete`删除(释放)内存。 智能指针(Smart Pointer)可以`自动释放内存`,甚至可以不使用new。 # 智能指针 std::unique_ptr, std::shared_ptr, std::weak_ptr ## unique_ptr unique_ptr是作用域指针,超出作用域会调用delete自动释放内存。 ```cpp #include
int main() { { std::unique_ptr
i1(new int); std::unique_ptr
i2 = std::make_unique
(); // 推荐 // std::unique_ptr
i3 = i2; // 错误。同一个地址std::unique_ptr只能存在一个 } return 0; } ``` ## shared_ptr shared_ptr通过引用计数(计数器),记录指向同一个内存的指针数量,当指针数量为0且超出作用域才会自动删除内存。 ```cpp #include
int main() { { std::shared_ptr
i; { std::shared_ptr
i1(new int); std::shared_ptr
i2 = std::make_shared
(); // 推荐 std::shared_ptr
i3 = i2; // 引用计数加1 i = i2; // 引用计数加1 } } return 0; // 引用计数为零,销毁i2 } ``` ## weak_ptr weak_ptr不会增加引用计数,不会让对象保持存活。 ```cpp #include
#include
int main() { { std::weak_ptr
i; { std::shared_ptr
i1(new int); std::shared_ptr
i2 = std::make_shared
(); // 推荐 std::shared_ptr
i3 = i2; // 引用计数加1 i = i2; // 引用计数不变 std::cout << *(std::shared_ptr
)i << std::endl; } } // 销毁i2 return 0; } ```