[C++]智能指针share_ptr 概述

 

智能指针是模板类而不是指针。类似vector,智能指针也是模板,当创建一个智能指针时,必须提供额外的信息即指针可以指向的类型。默认初始化的智能指针中保存着一个空指针[1]

智能指针是指向动态分配(堆)对象指针,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露。它的一种通用实现技术是使用引用计数。每次使用它,内部的引用计数加1,每次析构一次,内部引用计数减1,减为0时,删除所指向的堆内存。[1]

shared_ptr基于”引用计数”模型实现,多个shared_ptr可指向同一个动态对象,并维护一个共享的引用计数器,记录了引用同一对象的shared_ptr实例的数量。当最后一个指向动态对象的shared_ptr销毁时,会自动销毁其所指对象(通过delete操作符)。[1]

不要不加思考地把指针替换为shared_ptr来防止内存泄漏,shared_ptr并不是万能的,而且使用它们的话也是需要一定的开销的;

环状的链式结构shared_ptr将会导致内存泄漏(可以结合weak_ptr来解决);

 

ptr使用注意:

不要与裸指针混用

//错误场景1
int *x(new int(10));
shared_ptr<int> sp1(x);
shared_ptr<int> sp2(x);
//虽然sp1、sp2都指向x所指的内存,但他们是独立的,
//会在其他shared_ptr还在使用内存的情况下就释放掉内存
//失去了设计共享指针的意义
//同时,使用裸指针x本身也是很危险的,x随时可能变成空悬指针而无从知晓[2]
//错误场景2
//函数接受一个共享指针参数
void func(shared_ptr<int> sp);

int *x(new int(10));
//创建了一个指向x指针所指内存的共享指针,引用计数为1,是引用这块内存的唯一共享指针
func(shared_ptr<int> (x));
//离开函数即离开共享指针的作用域,这块内存即被释放
//导致提前释放内存[2]

谨慎使用p.get()的返回值

p.get()的返回值就相当于一个裸指针的值[2]

记得向shared_ptr传递删除器

如果用shared_ptr管理非new对象或是没有析构函数的类时,应当为其传递合适的删除器[2]

指定deleter之后,不再调用自己的析构函数

 

 

 

 

 

 

参考链接:

[1]https://blog.csdn.net/yuhan61659/article/details/81563629

[2]https://blog.csdn.net/River_Lethe/article/details/78734879

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值