如何确保(像try-finally一样)销毁heap分配的对象

How to ensure (like a try-finally) destruction of a HEAP-ALLOCATED object

本文关键字:heap 销毁 对象 一样 分配 何确保 确保 try-finally      更新时间:2023-10-16

我正在寻找一种方法来确保在堆上执行的对象在我完成它时总是被释放。

我知道如果它是在堆栈上分配的,我可以使用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);
}

有更好的方法来完成这个吗?或者这是公认的解决方案?

您仍然可以对函数返回的指针使用RAII。您可以像这样使用智能指针(这正是您所描述的虚拟类):

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

这个"哑类"被称为"智能指针"。你应该检查std::auto_ptrboost::shared_ptr