加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:20:00 所属栏目:百科 来源:网络整理
导读:我正在寻找一种方法来确保当我完成它时,在堆上执行的对象总是被释放. 我知道如果它被分配在堆栈上,我可以使用RAII来确保它将被处理 – 不幸的是,这对我(至少直接)不起作用,因为有问题的对象实际上是通过调用api函数创建的然后返回指向它在堆上创建的对象的指
我正在寻找一种方法来确保当我完成它时,在堆上执行的对象总是被释放.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读