힙에서 실행되는 오브젝트가 완료 될 때 항상 할당 해제되도록하는 방법을 찾고 있습니다.HEAP-ALLOCATED 오브젝트의 파괴 (try-finally) 파괴를 보장하는 방법
스택에 할당 된 경우 RAII를 사용하여 처리 할 수 있음을 알고 있습니다. 불행히도 문제의 개체가 실제로 만들어지기 때문에 (적어도 직접) 나를 위해 작동하지 않습니다. api 함수를 호출하면 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 함수가 포인터를 반환하면 해당 포인터에서'delete'를 호출 할 수 있는지 110 % 확실합니까? API가 그렇게 말합니까? 또는 자체 정리 기능을 제공합니까? –
Nemo - 아니, API 그대로 남아 있습니다. = P –