Использование ScopeGuard с несколькими распределениями ресурсов и точками выхода в функции

У меня есть несколько ресурсов, выделенных в функции, поэтому довольно много указателей, из которых я должен вернуть один указатель (скажем, 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;
}

0

Решение

Вы можете использовать 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);
}
1

Другие решения


По вопросам рекламы [email protected]