C++ 是否支持 'finally http://java.sun.com/docs/books/tutorial/essential/exceptions/finally.html' 块?
是什么RAII 习语 http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization?
C++ 的 RAII 习惯用法和C# 的 'using' 语句 http://www.c-sharpcorner.com/uploadfile/dipalchoksi/usingstatement11092005065819am/usingstatement.aspx?
No, C++ does not support 'finally' blocks. The reason is that C++ instead supports RAII: "Resource Acquisition Is Initialization" -- a poor name† for a really useful concept.
这个想法是对象的析构函数负责释放资源。当对象具有自动存储持续时间时,当创建该对象的块退出时,将调用该对象的析构函数 - 即使该块在存在异常的情况下退出。这是Bjarne Stroustrup 的解释 http://www.stroustrup.com/bs_faq2.html#finally的主题。
RAII 的一个常见用途是锁定互斥锁:
// A class with implements RAII
class lock
{
mutex &m_;
public:
lock(mutex &m)
: m_(m)
{
m.acquire();
}
~lock()
{
m_.release();
}
};
// A class which uses 'mutex' and 'lock' objects
class foo
{
mutex mutex_; // mutex for locking 'foo' object
public:
void bar()
{
lock scopeLock(mutex_); // lock object.
foobar(); // an operation which may throw an exception
// scopeLock will be destructed even if an exception
// occurs, which will release the mutex and allow
// other functions to lock the object and run.
}
};
RAII 还简化了将对象用作其他类的成员的过程。当所属类被析构时,RAII 类管理的资源将被释放,因为 RAII 管理类的析构函数因此被调用。这意味着当您对管理资源的类中的所有成员使用 RAII 时,您可以不用为所有者类使用一个非常简单的、甚至可能是默认的析构函数,因为它不需要手动管理其成员资源生命周期。 (谢谢Mike B指出这一点。)
对于熟悉 C# 或 VB.NET 的人来说,您可能会认识到 RAII 类似于使用 IDisposable 和“using”语句的 .NET 确定性销毁 https://web.archive.org/web/20091023110911/http://geocities.com/Jeff_Louie/deterministic_destructors.htm。事实上,这两种方法非常相似。主要区别在于 RAII 将确定性地释放任何类型的资源 — 包括内存。在.NET(甚至是.NET语言C++/CLI)中实现IDisposable时,除了内存之外的资源都会被确定性地释放。在 .NET 中,内存不是确定性释放的;内存仅在垃圾收集周期期间释放。
† 有些人认为“破坏就是资源放弃”是 RAII 习语的更准确名称。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)