第二部分:关于析构函数何时执行

第二部分:关于析构函数何时执行

作者:BlogUpdater |  时间:2021-03-12 |  浏览:1390 |  评论已关闭 条评论

让我们继续昨天的”故事”
下面是另外你必须小心留意析构函数执行顺序的例子。昨天的例子是讲述对象的析构函数在错误的时间点执行。今天,我们的主题是:对象析构函数压根就不会执行,这可不是你预先想到的情况,对吧?

假设,我们有一个ObjectLock类,它会在构造函数中获取锁对象,然后在其析构函数中释放它。如下图所示:

再一次地,上面的代码都是标准套路,看起来没有什么大的问题。代码中的第一个stuff会在没有锁定的情况下执行,而第二个stuff会在一个锁定的状态下执行。当这个函数返回时,这个锁会因为对象离开作用域而得到释放。

但是
如果我们假设有个像下图这样对代码进行了修改:

上述代码的改动主要是:如果操作被取消,则添加一个快速退出动作。但是,咱们再仔细想想,ObjectLock对象的析构函数会何时执行呢?

它会在return语句之后执行,因为这个时候对象会离开它的作用域。特别的是,当你调用ExitThread的之前,它不会执行。

结果就是:你会永久性的锁定资源。
你可以想象:这种形式的代码还有很多不同的类似版本,它们可能会导致资源泄露,资源锁定以及其他的你不愿意看到的问题。

总结
C++对象的构造函数和析构函数的自动执行,确实能帮我们来执行一些自动化的操作。人毕竟不是机器,总会有一些事情忘记做,比如分配的内存忘记了释放,打开的句柄忘记了关闭。这些都是丢给机器来做,也即:在C++对象的构造函数中执行资源的分配,在析构函数中进行资源的释放。
繁琐的工作简单了,我们的心也舒坦了。旺旺赞!

最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Do you know when your destructors run? Part 2.》

标签:

评论已关闭。