Yip*_*Yay 4 c++ exception throw
有人可以描述一下处理以下情况的正确方法:
wchar_t* buffer = new wchar_t[...];
if (!something)
{
throw std::runtime_error("Whatever");
// Now, at this point I'm leaking memory allocated for the 'buffer'.
}
// Perform actions.
delete[] buffer;
Run Code Online (Sandbox Code Playgroud)
解决它的明显方法意味着:
if (!something)
{
delete[] buffer;
throw std::runtime_error("Whatever");
}
Run Code Online (Sandbox Code Playgroud)
现在 - 好吗?(我怀疑是这样,但谁知道:)
PS我确实意识到有一种更好的方法 - 使用boost::scoped_array
或简单地std::wstring
允许被调用的析构函数释放已分配的内存,只是好奇.
你的见解是正确的.模式
Acquire some resource
Do something
Release resource
Run Code Online (Sandbox Code Playgroud)
从根本上说是错误的,因为Do something
可能会抛出异常并泄漏资源.此外,您必须记住释放资源,这是一个肥沃的错误来源.
正如您所指出的,正确的方法是始终使用析构函数释放资源的对象.这就是C++ 中RAII的名称.
这意味着例如.从来没有使用delete
外析构函数,或从不依靠手动关闭文件句柄,从来没有手动解锁互斥等了解智能指针,每当你可以使用它们.
请注意,某些语言(不是C++)提供了一个finally
关键字,它允许您执行一个指令块,而不管是否抛出异常.C++使用RAII,如果编写适当的析构函数,就不应该关注资源释放.
我有一个小工具,有对C++ 0x中允许执行任意代码在块退出,应该你写得不好(或C)库连接,一次或两次.
归档时间: |
|
查看次数: |
125 次 |
最近记录: |