C++智能指针的enable_shared_from_this和shared_from_this机制

知识的学习在于点滴记录,坚持不懈;知识的学习要有深度和广度,不能只流于表面,坐井观天;知识要善于总结,不仅能够理解,更知道如何表达!


如果不熟悉C++带引用计数的智能指针shared_ptr和weak_ptr,请参考我的另一篇介绍智能指针的博客:https://blog.youkuaiyun.com/QIANGWEIYUAN/article/details/88562935

鉴于同学们提问的一些有关智能指针的问题,这篇文章主要介绍C++11提供的智能指针相关的enable_shared_from_this和shared_from_this机制。

问题代码

先给出两个智能指针的应用场景代码,都是有问题的,仔细思考一下问题的原因。

代码清单1

#include <iostream>
using namespace std;
// 智能指针测试类
class A
{
   
   
public:
	A():mptr(new int) 
	{
   
   
		cout << "A()" << endl;
	}
	~A()
	{
   
   
		cout << "~A()" << endl;
		delete mptr; 
		mptr = nullptr;
	}
private:
	int *mptr;
};
int main()
{
   
   
	A *p = new A(); // 裸指针指向堆上的对象

	shared_ptr<A> ptr1(p);// 用shared_ptr智能指针管理指针p指向的对象
	shared_ptr<A> ptr2(p);// 用shared_ptr智能指针管理指针p指向的对象
	// 下面两次打印都是1,因此同一个new A()被析构两次,逻辑错误
	cout << ptr1.use_count() << endl; 
	cout << ptr2.use_count() << endl;

	return 0;
}

代码打印如下

A()
1
1
~A()
~A()

main函数中,虽然用了两个智能指针shared_ptr,但是它们管理的都是同一个资源,资源的引用计数应该是2,为什么打印出来是1呢?导致出main函数把A对象析构了两次,不正确!如果你有这样的疑问,说明对于shared_ptr的底层原理还没有完全搞清楚。

代码清单2

#include <iostream>
using namespace std;
// 智能指针测试类
class A
{
   
   
public:
	A():mptr(new int) 
	{
   
   
		cout << "A()" << endl;
	}
	~A()
	{
   
   
		cout << "~A()" << endl;
		delete mptr; 
		mptr = nullptr;
	}
	 
	// A类提供了一个成员方法,返回指向自身对象的shared_ptr智能指针。
	shared_ptr<A> getSharedPtr() 
	{
   
    
		/*注意:不能直接返回this,在多线程环境下,根本无法获知this指针指向
		的对象的生存状态,通过shared_ptr和weak_ptr可以解决多线程访问共享		
		对象的线程安全问题,参考我的另一篇介绍智能指针的博客*/
		return shared_ptr<A
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值