我正在寻找一种方法来确保在完成堆时执行的对象总是被解除分配。
我知道如果它被分配在堆栈上,我可以使用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);
}
有没有更好的方法来实现这一目标?或者这是公认的解决方案吗?
答案 0 :(得分:6)
“虚拟类”被称为“智能指针”。您应该查看std::auto_ptr
或boost::shared_ptr
。它们提供了您所寻找的内容。
答案 1 :(得分:6)
您仍然可以在函数返回的指针上使用RAII。您可以使用智能指针(这正是您所描述的虚拟类),如下所示:
std::unique_ptr<TheApi::ApiObject> p_myObj(TheApi::createAnApiObj());