在构造函数中抛出异常--是否安全,请大家讨论
myan 2001-11-27 06:36:45 这是不久之前我遇到的一个问题。例如我们封装Win32 mutex,
class MyError : public std::runtime_error {...};
class Mutex {
HANDLE hMutex_;
public:
Mutex(const char* name = 0, bool is_owner = false,
SECURITY_ATTRIBUTES* psa = 0)
:hMutex_(0)
{
hMutex_ = ::CreateMutex(psa, is_owner, name);
if (hMutex_ == 0)
throw MyError; // 注意这里
}
~Mutex() throw()
{
if (hMutex_)
::CloseHandle(hMutex);
}
// other stuff
};
最初我认为这样有可能导致内存泄漏,因为如果用户如下使用Mutex:
try
{
auto_ptr<Mutex> apMutex(new Mutex()); // 这里抛出异常
...
}
catch (...)
{
...
}
则可能导致分配给Mutex对象的那部分空间泄漏。结果证明我是错的。这与C++ new操作的方式有非常大的关系。所以我想把这个问题提出来,看看大家是怎么考虑的。