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()); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |