C++11 Shared_ptr


#include "pch.h"
#include <iostream>

using namespace  std;

void DeleteIntPtr(int* p)
{
	delete p;
}
int main()
{
	/*
		shared_ptr 共享智能指针,使用引用计数,每一个shared_ptr的拷贝都指向相同的内存。
		在最后一个shared_ptr析构的时候,内存才会被释放。			
	*/
	//1.初始化
	shared_ptr<int> p(new int(1));
	shared_ptr<int> p2 = p;
	shared_ptr<int> ptr;
	ptr.reset(new int(1));

	if (ptr)
	{
		cout << "ptr is not null";
	}
	// 不能将一个原始指针直接赋值给一个智能指针,尽量用make_shared来构造智能指针,因为它更加高效
	// shared_ptr<int> p = new int(1); // error
	//2.获取原始指针
	{
		shared_ptr<int> ptr(new int(1));
		int* p = ptr.get();
	}
	//3.指定删除器
	{
		shared_ptr<int> p(new int(1), DeleteIntPtr);
		// lambda表达式写法
		shared_ptr<int> pt(new int, [](int* p) {delete p; });
	}
	//4.注意问题
	{
		//1)不要用一个原始指针初始化多个shared_ptr
		{
			int* ptr = new int;
			shared_ptr<int> p1(ptr);
			shared_ptr<int> p2(ptr); // logic error
		}
		//2) 不要在函数实参中创建share_ptr
		// function (shared_ptr<int>(new int),g()); //有缺陷
		// 正确写法
		// shared_ptr<int> p(new int());
		// f(p, g());
		//3)通过shared_from_this() 返回this指针。不要将this指针作为shared_ptr 返回出来,因为this指针本质上是一个裸指针,因此,这样可能会导致重复析构
		{
			struct A {
				shared_ptr<A>GetSelf()
				{
					// return shared_ptr<S>(this); //don't do this!
				}
			};

		}

		//4)避免循环引用。智能指针最大的一个陷阱就是循环引用,循环引用会导致内存泄露
		{
			struct A;
			struct B;

			struct A {
				shared_ptr<B> bptr;
				~A()
				{
					cout << "A is deleted!" << endl;
				}
			};

			struct B
			{
				 shared_ptr<A> aptr;
				 ~B() { cout << "B is deleted!" << endl; }
			};

			shared_ptr<A> ap(new A);
			shared_ptr<B> bp(new B);
			ap->bptr = bp;
			bp->aptr = ap;		// objects should be destroyed.

		}
	
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小蚂蚁_CrkRes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值