我正在尋找一種方法來確保在堆上執行的對象總是在我完成時釋放。如何確保(像一個試圖終於)銷燬一個HEAP ALLOCATED對象
我知道,如果它被分配到堆棧上,我可以使用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? – Nemo
如果一個API函數返回一個指針,你是否110%確定可以調用該指針上的'delete'? API是否這樣說?還是它提供了自己的清理功能? –
尼莫 - 不,不知道,我堅持原封不動的API。 = P –