【发布时间】:2011-08-31 00:30:37
【问题描述】:
我正在寻找一种方法来确保在堆上执行的对象在我完成后总是被释放。
我知道如果它是在堆栈上分配的,我可以使用 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);
}
有没有更好的方法来做到这一点?还是这是公认的解决方案?
【问题讨论】:
-
您无法修复(损坏的)API?
-
如果 API 函数返回一个指针,您是否 110% 确定可以在该指针上调用
delete? API 会这么说吗?还是提供了自己的清理功能? -
Nemo - 不,我坚持使用 API。 =P
-
Kerrek - 是的,我很肯定。他们在他们提供的一些示例代码中正是这样做的......
标签: c++ heap-memory raii try-finally