shared_ptr(智能指针)详解

问题:
为了使 new 动态分配的内存空间在程序的各条执行路径都能被释放,避免发生内存泄漏,引入shared_ptr(c++11)。

解决方案:
C++ 11 模板库的 头文件中定义的智能指针,即 shared _ptr 模板,就是用来部分解决这个问题的。

如何解决:
只要将 new 运算符返回的指针 p 交给一个 shared_ptr 对象“托管”,就不必担心在哪里写delete p 语句——实际上根本不需要编写这条语句,托管 p 的 shared_ptr 对象在消亡时会自动执行delete p。而且,该 shared_ptr 对象能像指针 p —样使用,即假设托管 p 的 shared_ptr 对象叫作 ptr,那么 *ptr 就是 p 指向的对象。

通过 shared_ptr 的构造函数,可以让 shared_ptr 对象托管一个 new 运算符返回的指针,写法如下:

shared_ptr<T> ptr(new T);  // T 可以是 int、char、类等各种类

此后,ptr 就可以像 T* 类型的指针一样使用,即 *ptr 就是用 new 动态分配的那个对象。多个 shared_ptr 对象可以共同托管一个指针 p,当所有曾经托管 p 的 shared_ptr 对象都解除了对其的托管时,就会执行delete p。

#include<iostream>
#include<memory>
using namespace std;

class A{
public:
	A(int n) :i(n){
		cout << "n = " << n << endl;
	};//构造函数初始值列表    
	/*A(int n){
		 i = n;
	}*/
	~A(){
		cout << i << " " << "destructed" << endl;
	}
public:
	int i;
};


int main(){
	shared_ptr<A> sp1(new A(2));  //A(2)由sp1托管,
	shared_ptr<A> sp2(sp1);       //A(2)同时交由sp2托管
	shared_ptr<A> sp3;
	sp3 = sp2;   //A(2)同时交由sp3托管
	cout << sp1->i << "," << sp2->i << "," << sp3->i << endl;
	A * p = sp3.get();      // get返回托管的指针,p 指向 A(2)
	cout << p->i << endl;  //输出 2
	sp1.reset(new A(3));    // reset导致托管新的指针, 此时sp1托管A(3)
	sp2.reset(new A(4));    // sp2托管A(4)
	cout << sp1->i << endl; //输出 3
	sp3.reset(new A(5));    // sp3托管A(5),A(2)无人托管,被delete
	cout << "end" << end1;
	return 0;
}

在这里插入图片描述
只有指向动态分配的对象的指针才能交给 shared_ptr 对象托管。将指向普通局部变量、全局变量的指针交给 shared_ptr 托管,编译时不会有问题,但程序运行时会出错,因为不能析构一个并没有指向动态分配的内存空间的指针。

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读