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

У меня есть несколько ресурсов, выделенных в функции, поэтому довольно много указателей, из которых я должен вернуть один указатель (скажем, ret_ptr) и освободить другие (все othr_ptrs) перед выходом из функции.

У меня есть несколько точек выхода в этой функции (где ret_ptr равен 0 или указывает на допустимую память или исключение). Поэтому перед всеми операторами возврата и в исключении (блоке 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; 
}

1 ответ

Решение

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