У меня есть несколько ресурсов, выделенных в функции, поэтому довольно много указателей, из которых я должен вернуть один указатель (скажем, ret_ptr) и освободить другие (все othr_ptrs) перед выходом из функции.
У меня есть несколько точек выхода в этой функции (где ret_ptr равен 0 или указывает на допустимую память или исключение). Поэтому перед всеми операторами return и в исключении (блоке catch) я должен удалить othr_ptrs (делая это несколько раз в функции). Есть ли способ с «ScopeGuards», чтобы я мог уменьшить количество очисток?
X* func()
{
try
{
A* a = new ..;
B* b = new ..;if (something)
{
delete a;
delete b;
return 0; // return NULL ptr
}
X* x = new ..;
}
catch(...)
{
delete a;
delete b;
return x;
}
delete a;
delete b;
return x;
}
Вы можете использовать std::unique_ptr
(C ++ 11), ваш пример становится примерно таким:
std::unique_ptr<X> func()
{
std::unique_ptr<X> x;
try
{
std::unique_ptr<A> a(new A);
std::unique_ptr<B> b(new B);
if (something)
{
return nullptr;
}
x.reset(new X);
}
catch (...)
{
return std::move(x);
}
return std::move(x);
}