我很难决定在这里删除我的派生类的最佳方法。我目前有以下布局:
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
我调用Tag::releaseMemory();
在每个标签上,因为 delete
在 Tag *
上只会释放 Tag
而不是实际的 TagWhatever
,从而导致内存泄漏。
我想到的另一个选择是为每个派生类添加一个新的虚拟方法,所以 Tag
的每个子类会有它自己的 releaseMemory()
而不是一个组合在父类(super class)中。
然后我想知道我是否已经在设计层面开始了糟糕的假设,假设所有内容都传递给了复杂类型 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
}
}
}
并且在运行时动态读取它并不能很好地处理堆栈上的实例。
我该怎么做才能使这个......我不知道......优雅?
最佳答案
一般来说,你只是declare a virtual destructor in the base class .这对堆栈和堆分配都很好。在多态删除的情况下,编译器找出真实类型并调用其析构函数。
关于c++ - 在哪里删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4882607/