第二部分:关于析构函数何时执行
让我们继续昨天的”故事”
下面是另外你必须小心留意析构函数执行顺序的例子。昨天的例子是讲述对象的析构函数在错误的时间点执行。今天,我们的主题是:对象析构函数压根就不会执行,这可不是你预先想到的情况,对吧?
假设,我们有一个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.》
- 下一篇: 微软C++团队将出席ACCU 2021
- 上一篇: 第一部分:关于析构函数何时执行
相关推荐
- TopomelBox 8 小时长运测试顺利完成
- Posted on 11月11日
- 实战经验:如何检测CMFCTabCtrl控件标签页切换事件
- Posted on 04月18日
- VS2019: 使用CMake工具链配置IntelliSense
- Posted on 12月11日
- 窗口可不是什么便宜的东西
- Posted on 07月06日
评论已关闭。