C++ shared_ptr

本文详细介绍了C++中智能指针shared_ptr的原理和常见操作,如引用计数、对象的自动释放、make_shared的使用等。通过实例展示了shared_ptr如何在不同场景下管理资源,强调了避免普通指针与智能指针混用的重要性,以防止内存泄漏和悬挂指针的问题。
摘要由CSDN通过智能技术生成

shared_ptr 其实就是对资源做引用计数——当引用计数为 0 的时候,自动释放资源。

常用操作

shared_ptr sp空智能指针,可以指向类型为T的对象
p->f()等价于(*p).f()
p.get()返回一个p所指向的对象的一个普通指针
make_shared(args)返回一个指向T类型的智能指针,args为初始化
shared_ptrp(q)p是q的一个指针,他们指向一个对象,所以该对象的计数器会加一
p=q将p所指的对象改为q指向的对象,因此原先p的计数减一,q的加一
p.unique()若其计数器为1,返回真
p.use_count()返回计数

下面写几个程序帮助理解

#include<iostream>
#include<memory>
#include<memory.h>
using namespace std;
int main()
{
	shared_ptr<int> p = make_shared<int>(100);
	cout << p.use_count() << endl; //此时计数器为1
	{
		shared_ptr<int>q(p);
		cout << p.use_count() << endl; //p和q指向同一资源,计数器为2
	}
	cout << p.use_count() << endl; //q释放了,所以计数器为1
}

#include<iostream>
#include<memory>
#include<memory.h>
using namespace std;
void f(shared_ptr<int>q)
{
	shared_ptr<int>p(q);
	cout<<"f:  "<<p.use_count()<<endl;//由于传参的时候会有一个对指针的拷贝,再加上这个新构造的指针,就有三个
	return;
}
shared_ptr<int> f1(shared_ptr<int>q)
{
	shared_ptr<int>p(q);
	cout<<"f1: "<<p.use_count()<<endl;
	return p; 
}
int main()
{
	int a=1;
	shared_ptr<int>p=make_shared<int>(a);
	cout<<p.use_count()<<endl;
	f(p);
	cout<<p.use_count()<<endl; //f中的q在除了作用域以后被释放,参数也被释放,所以又只有1
	shared_ptr<int>q=f1(p);
	cout<<p.use_count()<<endl;//return的时候增加了一个拷贝 所以是2
	system("pause");
}

注意:不要轻易把普通指针和智能指针混用!因为普通指针指向资源不会增加向对应的智能指针的计数器。

#include<iostream>
#include<memory>
#include<memory.h>
using namespace std;
int main()
{
	int *a=new int(3);
	cout<<(*a)<<endl; //值为3
	{
		shared_ptr<int> p(a);
	}
	cout<<(*a)<<endl; //值为乱码,因为上面的p在离开作用域后被释放,其指向的3计数器降为0,所以也会被释放,此时a在无意间变成了悬挂的指针!
	system("pause");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值