C++11新特性之智能指针—shared_ptr(共享指针)
1、为什么会有智能指针这个东西呢?C++语言本身是没有内存回收机制的(在此不得不羡慕用Java的大佬们),我们申请动态内存的时候,需要自己释放。忘记释放怎么办,能怎么办,泄漏呗!
2、C++11则引入了智能指针,智能指针是存储指向动态分配(堆)对象指针的类,用于生存期的控制,能够确保在离开指针所在作用域时,自动地销毁动态分配的对象,防止内存泄露。智能指针的核心实现技术是引用计数,每使用它一次,内部引用计数加1,每析构一次内部的引用计数减1,减为0时,删除所指向的堆内存。
所需的头文件
#include <memory>
using namespace std;
上图上代码吧
两个智能指针通过引用的方式传递指向,它们的use_count()为2,如果把其中的一个智能指针给释放了,内部会进行计数减一操作,如果不为0,那么这一块内存还不能释放。否则,可以释放该内存了。
// 普通计数引用初始化shared_ptr
shared_ptr<int> ptr1(new int(13)); // 初始化时指向一块开辟的内存
cout << "ptr1 count :" << ptr1.use_count() << endl; //计数值:1
shared_ptr<int> ptr2 = ptr1; // 初始化时指向ptr1指向的内存地址
cout << "ptr2 count :" << ptr2.use_count() << endl; //计数值:2
shared_ptr<int> ptru; // 只是定义的了一个shared_ptr,未初始化
cout << "ptru count :" << ptru.use_count() << endl; //计数值:0
shared_ptr<int> ptrn(nullptr); // 定义了一个指向nullptr的shared_ptr
cout << "ptrn count :" << ptrn.use_count() << endl; //计数值:
错误的初始化方式:
多次引用同一块内存地址对不同的智能指针进行初始化,会导致这一块内存 在释放时进行多次释放,程序奔溃。
int* iptr = new int(3); // 申请了一块内存
shared_ptr<int> ptr3(iptr); //使用ptr3指向iptr这块内存
cout << "ptr3 count :" << ptr3.use_count() << endl; //计数为:1
shared_ptr<int> ptr4(iptr); //使用ptr3指向iptr这块内存
cout << "ptr4 count :" << ptr4.use_count() << endl; // 计数为:1
由于ptr3和ptr4是两个shared_ptr同时使用的iptr进行的初始化,那么ptr3和ptr4 的计数都是为1,程序运行结束时,它们都会对它们指向的地址进行释放,由于内存只有一块,释放两次就会程序奔溃。