share_ptr使用注意事项

智能指针可以提供对动态内存安全而又方便的管理,但这建立在正确使用的前提下。为了正确使用智能指针,我们必须坚持一些基本规范。

1 避免同一块内存绑定到多个独立创建的shared_ptr上,因此要不使用相同的内置指针初始化(或reset)多个智能指针,不要混合使用智能指针和普通指针,坚持只用智能指针。

2 不delete get() 函数返回的指针,因为这样操作后,shared_ptr并不知道它管理的内存被释放了,会造成shared_ptr重复析构。

3 不使用 get()函数初始化或(reset)另外的智能指针。

shared_ptr<int> p = make_share<int> (42);
int *q = p.get();
{
  shared_ptr<int>(q); 
} // 程序块结束,q被销毁,指向的内存被释放。
int foo = *p; //  出错,p指向的内存已经被q释放,这是用get() 初始化另外的智能指针惹得祸。
// 请记住,永远不要用get初始化另外一个智能指针。

 

4 最安全的分配和使用动态内存的方法是用make_shared 函数,从内存开辟时就让shared_ptr接管内存管理,此函数开辟新对象空间并初始化,然后返回指向此对象的shared_ptr。

// 考虑下面对share_ptr操作的函数
void process(shared_ptr<int> ptr){

//使用ptr

} // ptr离开作用域,被销毁。

int* x = new int (1024);
process(shared_ptr<int> (x);
// 这样搞,执行完process之后,x所指向的内存就会被释放掉,这不是我们想要的。
// 所以应该在内存开辟的时候就让shared_ptr接管。
shared_ptr<int> x =make_share<int> (1024);
process(x);

 

5 如果使用的是get()返回的指针,切记当最后一个对应的智能指针销毁后,你的指针就变为无效了。

6 如果你使用的智能指针管理的资源不是new分配的内存,记住传递给它一个删除器。

 


 

 

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值