2011-08-31 13 views
3

힙에서 실행되는 오브젝트가 완료 될 때 항상 할당 해제되도록하는 방법을 찾고 있습니다.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); 
} 

더 좋은 방법이 있습니까? 아니면 받아 들인 해결책입니까?

+0

(깨진) API를 수정할 수 없습니까? – Nemo

+1

API 함수가 포인터를 반환하면 해당 포인터에서'delete'를 호출 할 수 있는지 110 % 확실합니까? API가 그렇게 말합니까? 또는 자체 정리 기능을 제공합니까? –

+0

Nemo - 아니, API 그대로 남아 있습니다. = P –

답변

6

함수가 반환 한 포인터에 대해 RAII를 계속 사용할 수 있습니다. 다음과 같이 스마트 포인터를 사용할 수 있습니다 :

std::unique_ptr<TheApi::ApiObject> p_myObj(TheApi::createAnApiObj()); 
+0

흠, 고마워 ... 정확히 내가 뭘 찾고있는 것 같아! –

+0

그래서 조금 성급하게 말할 수 있습니다 ... 내 특별한 경우에는 실제로 ApiObject에서 가까운 메소드를 호출하고 삭제해야합니다 ... 알아요, API 측면에서 가난한 디자인이 처리되어야합니다. ApiObject의 소멸자에서 ...이 상황을 처리하기위한 표준 방법은 무엇입니까? –

+2

@PaulMolodowitch 사용자 정의 삭제자를 사용하십시오. 'std :: unique_ptr '는'std :: unique_ptr >''std :: default_delete :: operator() (T * p);는'delete p;'를 실행한다. 'std :: unique_ptr '를 사용하여 파괴 시간을 원하는대로 할 수 있습니다. –

6

"더미 클래스"는 "스마트 포인터"라고합니다. std::auto_ptr 또는 boost::shared_ptr을 확인해야합니다. 그들은 당신이 찾는 것을 정확하게 제공합니다.

관련 문제