ScopeGuard用于多个资源分配和退出点的功能

时间:2014-07-01 12:12:35

标签: c++ raii 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 个答案:

答案 0 :(得分: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);
}