파생 된 클래스를 삭제하는 가장 좋은 방법을 결정하는 데 어려움을 겪고 있습니다. 저는 현재 다음과 같은 레이아웃을 가지고어디에서 삭제 하시겠습니까?
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
에있는 delete
은 Tag
만을 해제하고 실제는 TagWhatever
이 아니므로 모든 태그에서 Tag::releaseMemory();
을 호출하므로 메모리 누수가 발생합니다.
내가 생각한 또 다른 옵션은 모든 파생 된 클래스에 새로운 가상 메소드를 추가하는 것이므로 Tag
의 모든 자식은 수퍼 클래스에 결합 된 releaseMemory()
이됩니다.
그때 나는 이미이 있기 때문에, TagCompound
및 TagList
가 나는 또한 더 나은 솔루션을 찾을 수있는에 힙 객체 인 복합 유형에 전달 된 모든 가정하여 설계 수준에서 나쁜 오프 시작하고 있는지 궁금
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
}
}
}
그리고 동적으로 런타임에 스택에 인스턴스와 잘 재생되지 않는 읽기 : 전체 구조는 (단지 바이너리와 같은 자세한되지 않음) 다음과 같습니다 뭔가 파서의 일부입니다.
나는 이것을 어떻게 만들 수 있습니까? 나도 몰라 ... 우아한가요?
과도한 releaseMemory 멤버 함수를 사용하지 않는 이유는 무엇입니까? 나는 당신의 질문이 옳다면 충분하다고 생각합니다. – Arunmu