08 | smart_ptr:智能指针到底“智能”在哪里?
该思维导图由 AI 生成,仅供参考
什么是智能指针?
- 深入了解
- 翻译
- 解释
- 总结
智能指针在现代C++中扮演着重要角色,通过代理裸指针,实现了资源的自动管理,避免了内存泄漏等问题。文章介绍了unique_ptr和shared_ptr两种常见类型的智能指针,分别适用于独占所有权和共享资源的场景。然而,过度使用shared_ptr可能会降低运行效率,引发循环引用和难以排查的错误。为了解决循环引用问题,文章提出了使用weak_ptr的建议。总的来说,本文深入浅出地介绍了智能指针的使用方法和注意事项,为读者提供了全面的了解和使用指南。通过学习本文,读者可以清晰地了解智能指针的“智能”之处,以及如何在实际项目中应用智能指针来提高代码的安全性和可维护性。
《罗剑锋的 C++ 实战笔记》,新⼈⾸单¥59
全部留言(62)
- 最新
- 精选
- EglinuxC++ 这么小众吗?讲得这么好,如果写成书,完全可以看成另外一本 effective C++ 了,为什么才 3000 多订阅人数?
作者回复: 已经不少了吧,相识就是缘分,笑。
2020-05-23350 - 酸葡萄老师,您好,什么时候用weak_ptr,什么时候用shared_ptr?
作者回复: 我给一个不是很精确的评价标准吧。 shared_ptr是强引用,无论如何都需要持有共享对象的时候就用它。 weak_ptr是弱引用,不一定要持有对象,只是“偶尔”想去看看对象在不在,不在也可以接受。
2020-06-1729 - eletarior默认用的比较多的是unique_ptr ,相反的shared_ptr倒是用的不多,因为担心文中提到的循环引用,资源消耗,线程安全等问题。大部分时候,unique_ptr是能完全取代裸指针的。如果是存粹的标准C++代码,使用智能指针确实很舒服,把它们当成一个普通的类型看就行了。但是,同时,作为C++程序员我们又不得不和裸指针打交道,不论是Linux还是Windows,我们不可避免的要使用它们的系统api,于是就不得不使用get将智能指针转成裸指针。而这条指针所指向的内存在系统api里也许是不应该随意析构掉的,因为在系统内部可能还得继续使用这段内存,那么在这种场景下,智能指针的特性就可能帮倒忙,难受了😫。针对这种问题,我想到的就是延长这个智能指针的生命周期,或者直接使用release将裸指针释放出来,可是这样一来,delete就少不了要使用了😔
作者回复: 是的,涉及到系统底层,有时候就可能要用到delete,不过你也可以试着用RAII来管理,或者用shared_ptr的定制删除函数,还是能够找到不用delete的方式的。
2020-05-25220 - 颓废人才罗老师您好,还有一个问题,常用的C++ reference 我看到一个 cplusplus.com和cppreference.com, 但是网上有一些不好评价,觉得这两个网站都有问题,罗老师这边一般参考的哪些文档网站,可以推荐下么。非常感谢。
作者回复: 我一般看的是cppreference.com,觉得它的界面比较好,资料组织整理的也很清楚,和官方标准基本吻合。 这些网站都是免费的,我觉得就可以一起看,互相参照。
2020-07-02212 - 禾桃“因为 shared_ptr 具有完整的“值语义”(即可以拷贝赋值)” 一直都觉得值语义这三个字比较难理解。想请教下这个概念到底是想说明什么问题,这个“值”该怎么理解?
作者回复: 值是和引用对应的,值就是有实体,可以拷贝,而引用是虚的,只是个别名,操作上有区别。
2020-05-2511 - Luke使用智能指针可以自动析构“资源”,隐含了指针管理的细节,从而提高了代码的安全性和易用性,但是这是否同时意味着效率下降?在极致追求执行速度的系统中,是否需要避免使用智能指针,依赖程序员自己管理裸指针的new和delete呢?
作者回复: 追求极致性能,那当然还是要自己管理好了,但这样也就要自己承担安全的责任了。 建议用unique_ptr,它的速度与裸指针几乎相同,没有引用计数的成本。
2020-05-306 - 郭郭老师,关于unique_ptr,如auto ptr = ptr1,那ptr1就应该被置空啦。不需要显示的调用std::move
作者回复: 我测试了一下,是不行的,会报编译错误,因为unique_ptr禁止了普通的拷贝赋值,只允许转移,必须调用std::move()。
2020-05-246 - Geek_王罗老师能把文中提到的血泪教训详细说一下吗?什么问题?怎么解决的?
作者回复: 就是类的析构函数比较大,里面的操作很多,用shared_ptr来管理,由于析构的时机不确定,经常会发生莫名其妙的系统抖动,就像是java/go的gc stop the world一样。
2020-08-2035 - The Answer老师,shared_ptr 本身是线程安全的,但是如何理解它所管理的对象不是线程安全的呢?
作者回复: shared_ptr就像是一个盒子,它自己是安全操作的,但一旦把里面的东西拿出来,就无法保证了。 shared_ptr和它指向的对象是彼此独立的,所以线程安全当然是没有关系的,shared_ptr只是一个handle,离开了handle,它就不能保证了。
2020-07-1245 - Zivon罗老师,今天尝试使用智能指针改写双向链表的时候感觉实现很麻烦啊,请问在实现这种基本数据结构的时候需要使用智能指针吗
作者回复: 基本的数据结构强调效率,用智能指针就有点成本略高,当然作为练手还是可以的。 智能指针最适合的应用场景是“自动资源管理”,链表还是不太合适,而且使用shared_ptr容易出现循环引用,改成weak_ptr会好一些。
2020-05-264