【发布时间】:2012-02-25 16:44:56
【问题描述】:
我正在学习 C++ 中的 RAII 习语,以及如何使用智能指针。
在我的阅读中,我遇到了两件在我看来似乎相互矛盾的事情。
引用自http://www.hackcraft.net/raii/:
...如果已创建具有 RAII 语义的成员对象并且在构造函数完成之前发生异常,则其析构函数将作为堆栈展开的一部分被调用。因此,控制多个资源的对象可以保证它们的清理,即使它不是使用成员 RAII 对象完全构造的。
但引用自http://www.parashift.com/c++-faq-lite/exceptions.html#faq-17.10:
如果构造函数抛出异常,则对象的析构函数不会运行。如果您的对象已经做了一些需要撤消的事情(例如分配一些内存、打开文件或锁定信号量),那么这个“需要撤消的东西”必须由对象内部的数据成员记住。
然后第二个链接源建议使用智能指针来处理已经在构造函数中分配的东西的问题。
那么在这些场景中实际发生了什么?
【问题讨论】:
-
+1 这是“newprogrammer[s]”应该提问的方式!
标签: c++ exception constructor raii