c++ - 在哪里删除?

标签 c++ oop

我很难决定在这里删除我的派生类的最佳方法。我目前有以下布局:

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();在每个标签上,因为 deleteTag * 上只会释放 Tag而不是实际的 TagWhatever ,从而导致内存泄漏。

我想到的另一个选择是为每个派生类添加一个新的虚拟方法,所以 Tag 的每个子类会有它自己的 releaseMemory()而不是一个组合在父类(super class)中。

然后我想知道我是否已经在设计层面开始了糟糕的假设,假设所有内容都传递给了复杂类型 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
    }
  }
}

并且在运行时动态读取它并不能很好地处理堆栈上的实例。

我该怎么做才能使这个......我不知道......优雅?

最佳答案

一般来说,你只是declare a virtual destructor in the base class .这对堆栈和堆分配都很好。在多态删除的情况下,编译器找出真实类型并调用其析构函数。

关于c++ - 在哪里删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4882607/

相关文章:

python - 如果在 __init__() 中不满足条件,则不要创建对象

c++ - 对象手势识别。 OpenCV C++

c++ - 具有现有变量的基于范围的 for 循环

javascript - 如何在javascript中构建关系结构?

java - 使用public getters/setters访问同一个类中的私有(private)变量,或者直接访问变量

java - 单例和其他设计问题

c++ - 使用基类指针访问继承变量

c++ - 如何将 Python dict 转换为 Pybind11 中的 C++ 计数器部分?

c++ - 我可以使用 VS2008 的 C++ 编译器使用 VS2010 并且仅使用 Server 2008 Platform SDK 进行编译吗?

java - 是否可以在另一个类中重写一个类的方法?