zoukankan      html  css  js  c++  java
  • 【M10】在构造方法内阻止资源泄漏

    1、类中没有指针,如果对象构造过程中出现异常,C++保证已经构造好的那一部分自动销毁。注意:这里不是调用析构方法,而是编译器在你的构造方法中插入了一些代码,保证对已经构造好的对象析构。

    2、类中有指针,比如有a, b两个指针。对象构造时,a初始化完成,b抛出异常,C++只会对已经构造好的对象析构,而不会对已经初始化好的指针执行delete。因此资源泄漏。

    3、注意,这种情况下,绝不会调用析构方法,因为C++只会析构已经构造完成的对象。接着思考,在堆上分配对象,把指针传出来,对指针delete,可行吗?

      不可行,因为构造过程出现异常,指针是传递不出来的。外部的指针还是null。

    4、思考:为什么C++只析构已经构造完成的对象?

      假如析构部分构造的对象,那么析构方法该做些什么事呢?应该是析构已经构造好的那一部分,但是这要求记录哪些内容已经构造好,哪些内容没有构造好,显然,这个代价太大,因此不执行。

    5、怎么解决上面的问题呢?

      对指针的初始化过程,使用try...catch。但是这里有个问题,对于const指针(不是指向const对象的指针),必须在初始化列表中进行初始化,没办法使用try...catch。该怎么办? 建立成员方法,返回指针。

    6、第一条我们就提到,对象构造过程中,如果出现异常,C++会对已经构造好的对象进行析构,但是不会对已经初始化好的指针进行delete。C++如何做到这一点,编译器在构造方法中插入了一些代码。因此,更好的解决办法是:不使用原始指针,而是使用智能指针,智能指针本质上就是:栈上的对象来管理资源。在这种情况下,类中没有原始指针,只有智能指针,对象构造过程出现异常,C++对已经构造好的对象进行析构,包括智能指针,进而释放资源。

  • 相关阅读:
    dubbo学习(一)认识
    MySQL学习(九)小结
    MySQL学习(八)删除表数据
    MySQL学习(六)change-buffer
    RPC 学习(一)认识
    MySQL学习(五)事务隔离
    MySQL学习(四)死锁及死锁检测
    计算机操作系统 --- 进程和进程的上下文切换
    MySQL 学习(三)事务学习
    消息队列(七)--- RocketMQ延时发送和消息重试(半原创)
  • 原文地址:https://www.cnblogs.com/nzbbody/p/3579143.html
Copyright © 2011-2022 走看看