C++智能指针

  1. STL一共给我们提供了4种智能指针:auto_ptr、unique_ptr、sharedptr和weak_ptr(本文档暂不介绍)。
  2. C++所有的智能指针类都有一个“explicit”构造函数(使其不能使用隐式转换!!),以指针作为参数。比如auto_ptr的类的模板原型为:
    在这里插入图片描述
    因此,不能自动将指针转换为智能指针对象,“必须显示调用”,例子如下:
    在这里插入图片描述

对于智能指针都应该避免一点:
在这里插入图片描述
即:不要将“栈内存的变量”赋值给智能指针!因为这样程序将把delete运算符用于非堆内存,这是错误的!!!

  1. 将两个指针同时指向一片内存时,如何避免释放资源时多次释放资源的错误。以下例子为这一问题的3种通用的解决方案:
    先看以下代码:
    在这里插入图片描述
    此时,vocation和ps两个指针都同时指向一块内存,如何正确释放内存,以下为解决方案:
    a. 定义赋值运算符,使其赋值时“深拷贝”。这样两个指针将指向不同的对象,其中的一个对象是另一个对象的副本,缺点是浪费内存空间,所以智能指针都未采取这种方案。
    b. 建立所有权(ownership)概念。对于特定的对象,只能有一个智能指针可拥有,这样只有拥有对象的智能指针的构造函数会删除该对象。“然后让赋值操作转让所有权”。这就是用于auto_ptr和unique_ptr的策略,但unique_ptr策略更为严格。
    c. 创建智能更高的指针,跟踪引用特定对象的智能指针计数。这称为“引用计数”。例如,赋值时,计数将加1,而指针过期时,计数将减1。当减为0时才调用delete。这是shared_ptr采用的策略。

  2. C++摒弃auto_ptr(C++98)的原因:以以下例子来分析:
    在这里插入图片描述
    上述例子中,运行后会崩溃,因为films[2]已经是空指针了!!
    上述例子的auto_ptr转换成shared_ptr或者unique_ptr后,程序就不会崩溃,原因如下:
    a. 使用shared_ptr运行时正常,因为shared_ptr采用引用计数,pwin和films[2]都指向同一块内存,在释放空间时因为事先要判断引用计数值得大小因此不会出现多次删除一个对象的错误。
    b. 使用unique_ptr时编译出错,与auto_ptr一样,unique_ptr也采用所有权模型,但使用unique_ptr时,程序不会等到运行阶段崩溃,而在编译以下代码时出现错误:在这里插入图片描述 即编译器直接指导你发现潜在的内存错误。
    综合所述:摒弃auto_ptr的原因就是:避免潜在的内存崩溃问题!!!!

  3. unique_ptr优于auto_ptr的原因:
    a. 在非法赋值语句的编译阶段就提示错误: 在这里插入图片描述
    b. 当试图将一个unique_ptr赋值给另一个时,如果源unique_ptr是个临时右值时,编译器允许这么做;如果源unique_ptr将存在一段时间,编译器将禁止这么做。例子如下:
    例子一:
    在这里插入图片描述

例子二:
在这里插入图片描述
#1留下悬挂的unique_ptr(pu1),这可能导致危害(即此指针此时其实是无效的,别人可能再次使用它,从而引起错误)。而#2不会留下悬挂unique_ptr,因为它调用unique_ptr的构造函数,该构造函数创建临时对象在其所有权给pu3后就会被销毁。
如果当我们想要执行类似于#1的操作,这时想将pu1指针重用,并可给它赋新值,我们可以使用C++的一个标准库函数std::move(),让你能够将一个unique_ptr赋给另一个。代码演示如下: 在这里插入图片描述
使用move后,原来的指针仍转让所有权变成空指针,但可以对其重新赋值!!!

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

参考文章:https://www.cnblogs.com/lanxuezaipiao/p/4132096.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值