c++ - 如何确保(像最终尝试一样)销毁 HEAP-ALLOCATED 对象

标签 c++ heap-memory 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);
}

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

最佳答案

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

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

关于c++ - 如何确保(像最终尝试一样)销毁 HEAP-ALLOCATED 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7251331/

相关文章:

singleton - 如何让 Rust 单例的析构函数运行?

C++ RAII析构函数异常

c++ - 匿名聚合中不允许构造函数,结构中的字符串

c++ - VC++。net中执行文件读取代码时出错

C++如何避免浮点运算错误

c - 堆相关问题

java - 如何检测 Java 堆何时快满并防止出现 "OutOfMemoryError: Java Heap"?

.NET - clr.dll 和 native 堆的高内存使用率

c++ - 从ole32.dll获取光标(4个奇怪的字节)

c - C语言中资源获取即初始化