智能指针

在C/C++编程中,指针的使用非常重要。但是在使用指针时有一个问题就是容易忘记释放相关资源,尤其是堆内存,造成内存泄漏。基于这个原因,出现了智能指针。智能指针其实是一个栈对象,当离开其生命周期时,其析构函数会被调用,我们在析构函数中将资源释放,这样就实现了自动回收的效果。

这里主要介绍三种auto_ptr(C++11已摒弃)、unique_ptr、shared_ptr。对于所有智能指针来说,使用时需要注意:所有智能指针都有显示构造函数,因此不能隐式转换,必须显示调用;不能作用于非堆内存。

当发生智能指针赋值时,会有重复释放的问题,auto_ptr和unique_ptr是基于所有权转让(只有一个指针拥有对象,赋值时所有权转让)的概念解决的,而shared_ptr是基于引用计数(赋值时计数加1,过期减1,计数为0时释放)的概念解决的。

auto_ptr发生所有权转让后,原指针悬空,如果继续使用则崩溃,而unique_ptr不允许所有权转让,编译阶段即报错,防止了潜在危险。且unique_ptr还有一点就是如果原指针是一个临时右值(比如函数返回值、临时对象等),则允许赋值,否则不允许。std::move函数能够将一个unique_ptr赋值给另一个。

如何选择智能指针?

如果程序要使用多个指向同一个对象的指针,应选择shared_ptr。这样的情况包括:有一个指针数组,并使用一些辅助指针来标示特定的元素,如最大的元素和最小的元素;两个对象包含都指向第三个对象的指针;STL容器包含指针。很多STL算法都支持复制和赋值操作,这些操作可用于shared_ptr,但不能用于unique_ptr(编译器发出warning)和auto_ptr(行为不确定)。如果你的编译器没有提供shared_ptr,可使用Boost库提供的shared_ptr。

如果程序不需要多个指向同一个对象的指针,则可使用unique_ptr。如果函数使用new分配内存,并返还指向该内存的指针,将其返回类型声明为unique_ptr是不错的选择。这样,所有权转让给接受返回值的unique_ptr,而该智能指针将负责调用delete。可将unique_ptr存储到STL容器,只要不调用将一个unique_ptr复制或赋给另一个算法(如sort())。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值