use*_*214 5 c++ exception-handling
以下示例留下可能的内存泄漏,因为析构函数不会针对在其构造函数运行期间处理异常的对象运行.我在哪里处理这个内存泄漏?
#include <exception>
class MyClass {
public:
MyClass()
{
c = new char[5];
throw std::runtime_error("test");
}
~MyClass ()
{
delete[] c;
}
private:
char *c;
};
int main()
{
try
{
MyClass Obj;
}
catch (std::runtime_error)
{
}
}
Run Code Online (Sandbox Code Playgroud)
你最好使用RAII,在这种情况下智能指针是特定的.
或者,您可以使用两阶段构建策略.
您可以始终try-catch在构造函数体内使用封闭块,并为您动态分配的所有资源显式调用delete,但考虑到您有n动态分配的资源数量的情况,显式跟踪您需要的每个资源变得非常麻烦catch在这种情况下,解除分配,RAII为您提供最佳解决方案,因为每个资源都隐含地处理自己的释放,您不需要有跟踪每个资源的开销.
boost::scoped_ptr或者std::tr1::scoped_ptr适合这种情况而不是任何原始指针.