【问题标题】:Deleting objects from template list从模板列表中删除对象
【发布时间】:2011-04-15 16:00:07
【问题描述】:

我有一个模板列表说,

List<SuperClass*>* mList;

for(int i = 0;i < mList->ElementsCount();i++)
    mList->DeleteElementAtIndex(i);

在 mList 中添加子类的对象。

从列表中删除对象时, 我是否需要将对象转换为相应的子类并调用delete方法?

【问题讨论】:

  • 如果你用智能指针容器(如std::vector&lt;boost::shared_ptr&lt;SuperClass&gt; &gt;)或专用指针容器(如boost::ptr_vector&lt;SuperClass&gt;)替换原生指针容器,你不必担心。
  • 不过,请记住,它们也需要虚拟析构函数才能正常工作。

标签: c++ stl subclass destructor delete-operator


【解决方案1】:

不,在每个指针上调用 delete 运算符而不显式转换就足够了,但是您必须确保将类层次结构中类的析构函数声明为 virtual(仅标记其中一个就足够了基类本身)。这样,对析构函数的调用就会是虚调用,所以会调用正确的析构函数。

如果你没有将析构函数声明为虚拟的,当在每个指针上调用delete 时,基类的析构函数将被调用而不是正确的;这就是为什么认为没有virtual 析构函数的类层次结构几乎总是错误的原因。

可以在 C++ FAQ Lite 的relevant entry 中找到更多信息。

顺便说一句,该列表似乎不是 STL 列表 (std::list),如果是这样,您应该从问题中删除 STL 标记。

【讨论】:

  • 此处的信息与 STL 容器以及任何自定义相关。
  • 嗯,它通常与指向基类的指针有关。是否有任何关于指针的问题被标记为 STL? :)
猜你喜欢
  • 2021-08-03
  • 2020-04-17
  • 1970-01-01
  • 2014-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-08
相关资源
最近更新 更多