• 【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++对已经构造好的对象进行析构,包括智能指针,进而释放资源。

  • 相关阅读:
    WCF使用net.tcp寄宿到IIS中
    (转)Dubbo 简单Dome搭建
    Linux压缩解压
    Linux关闭开启防火墙命令
    简单登录(jsp+servlet)
    UVa 10285 Longest Run on a Snowboard [DP]
    UVa 1218 Perfect Service [DFS+DP]
    第三届ACM山东省赛 Pick apples [贪心+动规]
    ZOJ 3326
    HDU 1029
  • 原文地址:https://www.cnblogs.com/nzbbody/p/3579143.html
Copyright © 2020-2023  润新知