2011-02-03 4 views
0

파생 된 클래스를 삭제하는 가장 좋은 방법을 결정하는 데 어려움을 겪고 있습니다. 저는 현재 다음과 같은 레이아웃을 가지고어디에서 삭제 하시겠습니까?

class Tag { 
    // Stuff 
    // [...] 
    void releaseMemory(Tag *t); 
}; 

class TagByte : public Tag { /* [...] */ }; 
class TagShort : public Tag { /* [...] */ }; 

Tag::releaseMemory(Tag *t) { 
    switch (t->getType()) { 
     case TAG_BYTE: delete (TagByte *)t; return; 
     case TAG_SHORT: delete (TagShort *)t; return; 
     // [...] many more 
    } 
} 

나는이 거기에 다른 종류의 태그를 포함 TagCompound 같은 더 복잡한 태그, 그리고 그 모두가 Tag *로 저장된다는 것입니다 뭐하는 거지 이유. 소멸자 내에서 ~TagCompound, ~TagList 에있는 deleteTag만을 해제하고 실제는 TagWhatever이 아니므로 모든 태그에서 Tag::releaseMemory();을 호출하므로 메모리 누수가 발생합니다.

내가 생각한 또 다른 옵션은 모든 파생 된 클래스에 새로운 가상 메소드를 추가하는 것이므로 Tag의 모든 자식은 수퍼 클래스에 결합 된 releaseMemory()이됩니다.

그때 나는 이미이 있기 때문에, TagCompoundTagList가 나는 또한 더 나은 솔루션을 찾을 수있는에 객체 인 복합 유형에 전달 된 모든 가정하여 설계 수준에서 나쁜 오프 시작하고 있는지 궁금

TAG_Compound("Root"): 4 entries 
{ 
    TAG_String("Name"): Test 
    TAG_Short("SomeNumber"): 21 
    TAG_Double("..."): 9000.5 
    TAG_Compound("Eek!"): 2 entries 
    { 
    TAG_String("Marco"): Polo 
    TAG_List("Names"): 3 entries of type String 
    { 
     TAG_String: Hello 
     TAG_String: World 
     TAG_String: Segfault 
    } 
    } 
} 

그리고 동적으로 런타임에 스택에 인스턴스와 잘 재생되지 않는 읽기 : 전체 구조는 (단지 바이너리와 같은 자세한되지 않음) 다음과 같습니다 뭔가 파서의 일부입니다.

나는 이것을 어떻게 만들 수 있습니까? 나도 몰라 ... 우아한가요?

+0

과도한 releaseMemory 멤버 함수를 사용하지 않는 이유는 무엇입니까? 나는 당신의 질문이 옳다면 충분하다고 생각합니다. – Arunmu

답변

5

일반적으로 declare a virtual destructor in the base class입니다. 이것은 스택과 힙 할당 모두에 유용합니다. 다형성 삭제의 경우 컴파일러는 실제 유형을 파악하고 소멸자를 호출합니다.

+0

그것은 실제로 내가했던 것보다 덜 복잡합니다. 감사합니다. – LukeN

1

이 디자인은 실제로 캡슐화의 아이디어를 깨뜨립니다. 태그는 TagByte가 존재한다는 것을 결코 알아야하지 않습니다. Tag의 소멸자는 각 파생 클래스의 소멸자와 마찬가지로 가상으로 표시되어야합니다. 적절한 소멸자의 각 레벨에 할당 된 변수를 해제합니다. 파괴시 모든 것이 메모리 누수없이 올바른 순서로 정리됩니다. 제 느낌은이 디자인이 처음부터 나쁘다는 것입니다. 소멸자와 상속을 읽어야합니다.

+0

그래, 나도 그렇게 생각 했으므로 더 잘 아는 사람들에게 더 잘 물어보기로 결심했습니다! – LukeN

1

실제로 C++은 가상 소멸자에 대해 매우 우아한 솔루션을 제공합니다. 더군다나 모든 다형성 타입은 하나를 가져야합니다. GCC도이 -Wnon-virtual-dtor에 대한 경고 수준을 가지고 있습니다.

관련 문제