几种智能指针比较
发布日期:2021-11-07 23:20:55 浏览次数:3 分类:技术文章

本文共 2295 字,大约阅读时间需要 7 分钟。

auto_ptr

因为auto_ptr并不是完美无缺的,它的确很方便,但也有缺陷,在使用时要注意避免。首先,不要将auto_ptr对象作为STL容器的元素。C++标准明确禁止这样做,否则可能会碰到不可预见的结果

auto_ptr的另一个缺陷是将数组作为auto_ptr的参数: auto_ptr<char> pstr (new char[12] ); //数组;为定义

然后释放资源的时候不知道到底是利用delete pstr,还是 delete[] pstr;

然后收集了关于auto_ptr的几种注意事项:

1、auto_ptr不能共享所有权。
2、auto_ptr不能指向数组
3、auto_ptr不能作为容器的成员。
4、不能通过赋值操作来初始化auto_ptr
std::auto_ptr<int> p(new int(42)); //OK
std::auto_ptr<int> p = new int(42); //ERROR
这是因为auto_ptr 的构造函数被定义为了explicit
5、不要把auto_ptr放入容器

 

scoped_ptr

boost::scoped_ptr的实现和std::auto_ptr非常类似,都是利用了一个栈上的对象去管理一个堆上的对象,从而使得堆上的对象随着栈上的对象销毁时自动删除。不同的是,boost::scoped_ptr有着更严格的使用限制——不能拷贝。这就意味着:boost::scoped_ptr指针是不能转换其所有权的。

  1. 不能转换所有权
    boost::scoped_ptr所管理的对象生命周期仅仅局限于一个区间(该指针所在的"{}"之间),无法传到区间之外,这就意味着boost::scoped_ptr对象是不能作为函数的返回值的(std::auto_ptr可以)。
  2. 不能共享所有权
    这点和std::auto_ptr类似。这个特点一方面使得该指针简单易用。另一方面也造成了功能的薄弱——不能用于stl的容器中。
  3. 不能用于管理数组对象
    由于boost::scoped_ptr是通过
    delete来删除所管理对象的,而数组对象必须通过
    deletep[]来删除,因此boost::scoped_ptr是不能管理数组对象的,如果要管理数组对象需要使用boost::scoped_array类。

boost::scoped_ptr和std::auto_ptr的功能和操作都非常类似,如何在他们之间选取取决于是否需要转移所管理的对象的所有权(如是否需要作为函数的返回值)。如果没有这个需要的话,大可以使用boost::scoped_ptr,让编译器来进行更严格的检查,来发现一些不正确的赋值操作。

shared_ptr

1. shared_ptr是Boost库所提供的一个智能指针的实现,shared_ptr就是为了解决auto_ptr在对象所有权上的局限性(auto_ptr是独占的),在使用引用计数的机制上提供了可以共享所有权的智能指针.

2. shared_ptr比auto_ptr更安全
3. shared_ptr是可以拷贝和赋值的,拷贝行为也是等价的,并且可以被比较,这意味这它可被放入标准库的一般容器(vector,list)和关联容器中(map)。

boost::shared_ptr的管理机制其实并不复杂,就是对所管理的对象进行了引用计数,当新增一个boost::shared_ptr对该对象进行管理时,就将该对象的引用计数加一;减少一个boost::shared_ptr对该对象进行管理时,就将该对象的引用计数减一,如果该对象的引用计数为0的时候,说明没有任何指针对其管理,才调用delete释放其所占的内存。

参考:

 

weak_ptr

一个强引用当被引用的对象活着的话,这个引用也存在(就是说,当至少有一个强引用,那么这个对象就不能被释放)。boost::share_ptr就是强引用。

相对而言,弱引用当引用的对象活着的时候不一定存在。仅仅是当它存在的时候的一个引用。弱引用并不修改该对象的引用计数,这意味这弱引用它并不对对象的内存进行管理,在功能上类似于普通指针,然而一个比较大的区别是,弱引用能检测到所管理的对象是否已经被释放,从而避免访问非法内存

boost::weak_ptr<T>是boost提供的一个弱引用的智能指针,它的声明可以简化如下:

namespace boost {

template<typename T> class weak_ptr {
public:
template <typename Y>
weak_ptr(const shared_ptr<Y>& r);
weak_ptr(const weak_ptr& r);
~weak_ptr();
T* get() const;
bool expired() const;
shared_ptr<T> lock() const;
};
}

可以看到,boost::weak_ptr必须从一个boost::share_ptr或另一个boost::weak_ptr转换而来,这也说明,进行该对象的内存管理的是那个强引用的boost::share_ptr。boost::weak_ptr只是提供了对管理对象的一个访问手段。

boost::weak_ptr除了对所管理对象的基本访问功能(通过get()函数)外,还有两个常用的功能函数:expired()用于检测所管理的对象是否已经释放;lock()用于获取所管理的对象的强引用指针。

参考:

           

转载地址:https://blog.csdn.net/zhangwu416826/article/details/7610463 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:typeid详解
下一篇:内存池

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年03月26日 03时02分42秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

最好吃的8款粽子,看看有没有你家乡的! 2019-04-25
端午前后湿热当道,这些祛湿的好方法一定要收好 2019-04-25
九巨龙集团被授予“2020年全市疫情防控慈善捐助企业楷模” 2019-04-25
清徐老陈醋签约盒马与数字乡村特色新品战略合作 2019-04-25
视听·封报丨5G发展带来哪些改变?“虚拟偶像”成为追星新潮流 2019-04-25
最好吃的8款粽子,看看有没有你家乡的! 2019-04-25
第10届上海尚品家居展实力来袭,优质生产型企业加持核心优势 2019-04-25
丁磊:高合汽车下个月交付过千,刷新纪录 2019-04-25
2021乌拉盖旅游推介会暨“爱上草原”云平台发布仪式 2019-04-25
博仲兴业力作——《爱的雨季》讲述爱情的奥秘 2019-04-25
墨斗互动公益助力山西大学 毕业季,青春无畏,逐梦扬威 2019-04-25
中品丝路:在重要场所讲好中国品牌故事 2019-04-25
夏日狂欢 — BODY JAZZ两周年庆典———若水,以柔见世界 2019-04-25
京东品牌联盟:618品牌狂欢盛典-品宣销售再创历史新高 2019-04-25
五色新丝缠角粽 粽享孝养温情|九巨龙孝养城带您粽情一夏 2019-04-25
九巨龙这两学校竟麦浪滚滚!太美!太用心! 2019-04-25
高端内存的由来(为什么需要高端内存) 2019-04-25
Android 第三方分享 ShareSDK 回调不成功问题 2019-04-25
AndroidStudio Instant Run 报错问题 2019-04-25
Android 优秀源码收集方式 2019-04-25