如何确保(像try-finally)破坏HEAP-ALLOCATED对象

时间:2011-08-31 00:30:37

标签: c++ stack heap raii try-finally

我正在寻找一种方法来确保在完成堆时执行的对象总是被解除分配。

我知道如果它被分配在堆栈上,我可以使用RAII来确保它将被处理 - 不幸的是,这对我来说(至少直接)不起作用,因为有问题的对象实际上是通过调用创建的一个api函数,然后返回一个指向它在堆上创建的对象的指针。

所以,从概念上讲,我想要做的是:

TheApi::ApiObject* p_myObj = TheApi::createAnApiObj();
try
{
    doStuffWithMyObjThatMayError(p_myObj);
}
finally
{
    delete p_myObj;
}

我唯一能想到的就是创建一些虚拟清理类,并在堆栈上创建一个实例:

class MegaMaid
{
private:
    TheApi::ApiObject* toFree;
public:
    MegaMaid(TheApi::ApiObject* toFree)
    {
        this->toFree = toFree;
    }

    ~MegaMaid()
    {
        delete toFree;
    }
};

void doStuff()
{
    TheApi::ApiObject* p_myObj = TheApi::createAnApiObj();
    TheApi::ApiObject* p_myObj;
    MegaMaid cleaner(p_myObj);
    doStuffWithMyObjThatMayError(p_myObj);
}

有没有更好的方法来实现这一目标?或者这是公认的解决方案吗?

2 个答案:

答案 0 :(得分:6)

“虚拟类”被称为“智能指针”。您应该查看std::auto_ptrboost::shared_ptr。它们提供了您所寻找的内容。

答案 1 :(得分:6)

您仍然可以在函数返回的指针上使用RAII。您可以使用智能指针(这正是您所描述的虚拟类),如下所示:

std::unique_ptr<TheApi::ApiObject> p_myObj(TheApi::createAnApiObj());