C+++第十二章:智能指针

首先:shared_ptr

       shared_ptr<int> q2 =new int(42) //这个拷贝初始化操作错误,
       //因为智能指针构造函数是explicit 的 =所以右边是一个int *不能隐式转换到shared_ptr、
       
       shared_ptr<int> q2(new int(42))//采用直接初始化正确的
  
       //如果非要采用拷贝初始化,必须以下操作,先显式绑定,
       //右式相当于创建了一个shared_ptr临时变量,类似于多参数的sting初始化也必须是这样,
       //单参数string可以拷贝初始化。
       shared_ptr<int>o q2 =shared_ptr<int>(new int(42) )//正确,显式绑定拷贝初始化。

关于use_count

std::shared_ptr<int> p1(new int(42));
	int *q1 = p1.get();
	
	{	

	   //shared_ptr<int>(q1); 如果单单这个语句,是不会影响p1的。
	   //单独创建临时变量不进行拷贝操作,临时创建变量销毁后对p1管理的内存并没有任何影响。
	   
	   auto q2 =shared_ptr<int>(q1) 这样才有一个实质的q2指向和p1一样的动态内存
       //但这样q2不是p1的拷贝,是相互独立创建的,所以use_count是各自为1
		  
		cout << "after q2 q2 use count is  " << q2.use_count();  
		cout << "after q2 p1 use count is  " << p1.use_count();
	
	}
	//结束后会q2销毁 ,动态内存会释放这时候p1是一个空悬指针,
	//已经无法正确访问p1 
	//那么在main函数结束后又要自动释放p1(因为智能指针范围失效自动释放)的内存,产生了双重释放错误

/*
	std::shared_ptr<int> p1(new int(42));
	
	//创建一个临时变量 ,并传递给函数参数shared_ptr变量进行拷贝,但不是p1的拷贝,
	 //那么这个函数参数shared_ptr变量是和p1独立建造的,
	 //所以use_count是各自为1,但和p1指向同样的动态内存,
	process(std::shared_ptr<int>(p1.get()));
	
   //函数结束后销毁了函数中的shared_ptr变量,释放了内存,
   //那么p1也就成为了空悬指针,在main函数结束后,又要自动释放p1的内存,
   //但此时p1的内存已经释放了
   //产生了双重释放
   //但如果p1就是一个内置指针指向动态内存auto p1 = new int(42); 
   //process(std::shared_ptr<int>(p1));就不存在双重释放
   //因为main函数结束后,不会自动释放p1(因为不是智能指针)但p1成为了空悬指针

然后:unique_ptr

int ix = 1024, *pi = &ix, *pi2 = new int(2048);

	typedef std::unique_ptr<int> IntP;

   // IntP p0(ix);//参数就错误了

   //  IntP p1(pi);//编译能通过,但最后main函数结束p1会释放内存操作, 但p1指向的不是动态内存(不是new分配的),所以报错

   //  IntP p2(pi2); //main函数结束p2会释放内存操作,那么pi2指向的内存就被释放,pi2就成为了空悬指针
	
   // IntP p3(&ix);///编译能通过,但最后main函数结束p3会释放内存操作, 但p3指向的不是动态内存(不是new分配的),所以报错

   // IntP p4(new int(2048));//正常 正确


/*  p2和p5指向同一内存,但是为unique_ptr类型,所以错误
		   IntP p2(new int(555));

		   IntP p5(p2.get());
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值