C++11 智能指针简介
C++11 智能指针简介
Written on 2023-01-16
学习参考资料:
- C++现代实用教程:智能指针
- 30分钟讲明白现代C++最重要的特性之一:智能指针
- 动态内存管理官方文档
- 爱编程的大丙 | 共享智能指针
- 爱编程的大丙 | 独占的智能指针
- 爱编程的大丙 | 弱引用智能指针
个人学习智能指针记录合集:
栈对象、静态对象、堆对象
栈对象
调用函数或者执行某个程序块时,执行过程产生的局部变量(栈对象)是分配在栈内存上面,函数调用结束或者执行完毕程序块后,局部变量(栈对象)会自动释放(析构),这个过程是自动控制的。
静态对象
静态对象是在使用之前分配好的,是在完整的程序结束时释放。
堆对象
动态分配的对象称为堆对象,堆内存用于动态分配内存,动态分配的对象分配在堆内存上。
动态分配内存的意思是需要手动去申请这块内存 new
,使用完之后也需要手动释放 delete
,delete
是析构了指向的地址所存的东西,不然这块内存就会一直存在,会造成内存泄漏,无论是在何处(函数内部、程序块等)动态申请的。
智能管理动态分配对象
C++ 作为追求性能到极致的语言,没有像其他高级语言有垃圾回收机制,在语言层面上来解决内存泄漏这个问题,需要依靠程序员自己管理内存的分配和释放。
现代 C++ 提供了一些工具,用以辅助解决这个问题,就是使用智能指针(smart pointer),使得我们不需要手动释放动态分配的内存。
智能指针是存储指向动态分配(堆)对象地址的类,自动管理动态分配的对象。
C++11 智能指针定义于头文件 #include <memory>
中,有四种智能指针类别:
std::unique_ptr
拥有独有对象所有权语义的智能指针,称为独占智能指针std::shared_ptr
拥有共享对象所有权语义的智能指针,称为共享智能指针,或者计数智能指针std::weak_ptr
到 std::shared_ptr 所管理对象的弱引用,称为弱智能指针std::auto_ptr
拥有严格对象所有权语义的智能指针
其中,std::auto_ptr
已于 C++17 中移除,这段时间,先学习 C++11 时的特性,对于 C++11 之后增添的先不记录。
智能指针只解决了一部分问题,并没有从根本上解决 C++ 内存安全的问题,还需加以注意,不然是会依然造成内存泄漏这个问题的。