2012-07-16 3 views
4

질문 :함수에서 로컬 포인터를 삭제해야합니까? (C++)

함수에서 가져온 포인터를 삭제해야합니까 (생성되지 않고 그냥 가져온 것입니까?)? 예 :

#include <SomeObject> 

#define SAFE_DELETE(p) { if (p) { delete (p); (p) = NULL; } } 

class DraftObject 
{ 
public: 

    DraftObject() : _x(0) {} 
    ~DraftObject(){} 

    int CalculateSomething() 
    { 
     AnotherObject* aObj = SomeObject::getInstance()->getAObjPointer(); 

     /* Do some calculations and etc... */ 
     _x += aObj->GetSomeIntValue(); 

     SAFE_DELETE(aObj) // <-- Would you recomend this here? 

     return _x; 
    } 

protected: 
    int _x; 
}; 

aObj는 SomeObject 인스턴스에서 다른 경우에도 재사용됩니다. 나는 계속해서 내가 필요로하는 모든 것을 SomeObject::getInstance()->getAObjPointer()이라고 부르지 만, SomeObject::getInstance()->getAObjPointer()->GetSomeIntValue()은 내 개인적인 의견으로 aObj->GetSomeIntValue()만큼 읽기 쉽지 않다. boost (shared_ptr, weak_ptr 또는 auto_ptr)에서 뭔가를 사용하더라도 걱정할 필요가 없다는 것을 알고 있습니다. 그러나이 방법이 더 흥미로운 방법입니다. 포인터를 삭제하지 않으면 메모리 누수 상황이 발생하거나 포인터를 삭제하면 메모리에서 삭제되므로 다른 범위 (인스턴스 객체는 물론 다른 곳에서도 사용될 수 있음)에서 사라집니다.

의견이 있으십니까?

건배.

+4

'삭제'무엇이'새 것'. – chris

+2

'delete 0;'은 아무 작업도하지 않는다는 것에주의하십시오. – hmjd

+0

'getAObjPointer'가 참조를 리턴하면, 그것을 삭제하지 않아도됩니다. 호출 된 위치에 새로운 조작이 있으면이를 h 제해야합니다. 그렇지 않으면 참조가 매달려 있습니다. – Mahesh

답변

5

에 따라 다릅니다.

SomeObject::getInstance()->getAObjPointer();이 각각의 호출마다 다른 개체를 반환하면 아마도 그렇습니다. 그렇지 않으면 아니오. 이 내용은에 설명되어 있습니다. 또한

, 당신의 "안전한 삭제"

#define SAFE_DELETE(p) { if (p) { delete (p); (p) = NULL; } } 

는 완전히 쓸모 입니다. 그리고 추한. 코드에서 이것을 보았다면, 나는 그것을 작성한 프로그래머를 놀리려고했다. pNULL이면 삭제가 안전합니다.

+0

동의합니다. SAFE_DELETE는 완전히 쓸모가 없습니다. –

+6

나는 "재미있게"부분을 좋아하지 않습니다. –

+0

@ NisonMaël 방금 썼습니다 : P –

0

아니요, delete을 사용하지 마십시오. 개체의 메모리 할당이 해제되어 나중에 사용할 수 없으므로 사용하지 마십시오.

+0

메서드가 호출 할 때마다 새 객체를 반환하지 않는다는 것을 어떻게 알 수 있습니까?그렇게되면 메모리 누수가 발생합니다. –

+0

그게 OP가 "SomeObject 인스턴스에서 다른 경우에도 aObj를 재사용 할 것"이라고했을 때 의미했던 것 같습니다. 그것은 정말로 불분명 한 질문입니다. –

0

API에 문서화되어야합니다.

일부 라이브러리는 내부 데이터 구조로 유지되기 때문에 사용자가 삭제하지 않아야하는 포인터를 반환합니다. 다른 것들은 사용자가 삭제해야하는 포인터를 만들고 있습니다.

실제로이 클래스와 함수를 작성했다고 가정하고,이 인스턴스를 다른 곳에서 사용하지 않으면 (함수 내부를 포함하여)이 함수의 끝에있는 포인터를 삭제하려고합니다.

+0

내 특별한 경우에 객체는 인스턴스에서 생성되고 DraftObject의 끝에서 할당 해제되지 않고 여러 번 다시 사용됩니다. 사용 후 삭제하지 않으면 내가 찾던 답입니다. 감사. – karmalis

+0

@karmalis 그러면 답을 _accept_해야합니다. –

관련 문제