c++shared_ptr接口及常规使用(C++类相关)

智能指针可分为:

  1. auto_ptr;
  2. shared_ptr
  3. unique_ptr
  4. weaked_ptr

其中auto_ptr已经废弃不用

shared_ptr的常用使用方式:

static void interface OfSharedPtr();
int main(){
	interfaceOfSharedPtr();
}
class Object{
	public:
	Object(int id):m_id(id){std::cout<<"init obj "<<m_id<<std::endl;}
	~Object(){std::cout<<"bye bye"<<m_id<<std::endl;}
	int id() const {return m_id;}
	private:
	int m_id;
};
typedef std::shared_ptr<Object> ObjectPtr;
void deleteOfObject(Object* obj){
	if(obj)
		std::cout<<"delete obj "<<obj->id()<<std::endl;
	delete obj;
}
void print (ObjectPtr obj){
	std:cout<<"count"<<obj.use_count()<<"id"<<obj->id()<<std::endl;
}

void printRef(count ObjectPtr& obj){
	std::cout<<"ref count"<<obj.use_count()<<"id"<<obj->id()<<std::endl;
}

void interfaceOfSharedPtr(){
	ObjectPtr null;
	std::cout<<"ref count is "<<null.use_count()<<std::endl;//0
	ObjectPtr obj(new Object(1));
	std::cout<<"ref count is "<<obj.use_count()<<std::endl;//1
	ObjectPtr obj2(obj);
	std:cout<<"ref count is"<<obj.use_count<<std::endl;//2
	std:cout<<"ref count obj2 is"<<obj2.use_count<<std::endl;//2
	ObjectPtr obj3 = obj;
	std::cout<<"ref count is "<<obj.use_count()<<std::endl;//3
	obj2.reset();//reset means what?
	obj2= nullptr;
	std::cout<<"ref count is "<<obj.use_count()<<std::endl;//2

	auto p = obj.get();
	if(p) {
		std::cout<<"id is "<<p->id()<<std::endl;
	}
	
	if(obj) {	// operator bool
		std::cout<<"p id is"<<obj->id()<<std::endl; //operator ->
		std::cout<<"ref id is"<<(*obj).id()<<std::endl;	//operator *
	}
	
	obj4 = nullptr;
	//if(obj.unique());
	//if(obj.use_count() == 1)
	std::cout<<"only one hold ptr "<<obj.unique()<<std::endl;
	print(obj);
	std::cout<<"ref count is"<<obj.use_count()<<std::endl;	//2
	printRef(obj);
}

shared指针提供自带user_count()函数:用于记录指针使用的人数;unique()函数用于判断当前使用的用户是否唯一。

用引用技术传入指针并不会改变外部指针的user_count否则以值的方式传入相当于拷贝会改变user_count

void print (ObjectPtr obj){
	std:cout<<"count"<<obj.use_count()<<"id"<<obj->id()<<std::endl;
}

void printRef(count ObjectPtr& obj){
	std::cout<<"ref count"<<obj.use_count()<<"id"<<obj->id()<<std::endl;
}

传const引用工作量最少,但有些时候也必须传值

默认当最后一个用户释放析构指针的时候会自动调用delete进行释放

也可以在new的时候传两个参数调用自己写的析构函数进行释放

void useDeleter(){
	ObjectPtr obj(new Object(2), deleterOfObject);
	ObjectPtr obj2 = obj;
}
void deleterOfObject(Object* obj){
	if(obj)
		std::cout<<"delete obj"<<obj->id()<<std::endl;
	delete obj;
}

所以用shared_ptr不仅仅可以管理new,delete的资源也可以管理其他类似的资源

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值