C++11 智能指针简介

C++11 智能指针简介

Written on 2023-01-16

学习参考资料:

个人学习智能指针记录合集:

栈对象、静态对象、堆对象

栈对象

调用函数或者执行某个程序块时,执行过程产生的局部变量(栈对象)是分配在栈内存上面,函数调用结束或者执行完毕程序块后,局部变量(栈对象)会自动释放(析构),这个过程是自动控制的。

静态对象

静态对象是在使用之前分配好的,是在完整的程序结束时释放。

堆对象

动态分配的对象称为堆对象,堆内存用于动态分配内存,动态分配的对象分配在堆内存上。

动态分配内存的意思是需要手动去申请这块内存 new,使用完之后也需要手动释放 deletedelete是析构了指向的地址所存的东西,不然这块内存就会一直存在,会造成内存泄漏,无论是在何处(函数内部、程序块等)动态申请的。

智能管理动态分配对象

C++ 作为追求性能到极致的语言,没有像其他高级语言有垃圾回收机制,在语言层面上来解决内存泄漏这个问题,需要依靠程序员自己管理内存的分配和释放。

现代 C++ 提供了一些工具,用以辅助解决这个问题,就是使用智能指针(smart pointer),使得我们不需要手动释放动态分配的内存。

智能指针是存储指向动态分配(堆)对象地址的类,自动管理动态分配的对象。

C++11 智能指针定义于头文件 #include <memory> 中,有四种智能指针类别:

  1. std::unique_ptr 拥有独有对象所有权语义的智能指针,称为独占智能指针
  2. std::shared_ptr 拥有共享对象所有权语义的智能指针,称为共享智能指针,或者计数智能指针
  3. std::weak_ptr 到 std::shared_ptr 所管理对象的弱引用,称为弱智能指针
  4. std::auto_ptr 拥有严格对象所有权语义的智能指针

其中,std::auto_ptr 已于 C++17 中移除,这段时间,先学习 C++11 时的特性,对于 C++11 之后增添的先不记录。

智能指针只解决了一部分问题,并没有从根本上解决 C++ 内存安全的问题,还需加以注意,不然是会依然造成内存泄漏这个问题的。

posted @ 2023-01-16 21:38  Champrin  阅读(73)  评论(0编辑  收藏  举报