代码之家  ›  专栏  ›  技术社区  ›  Michael Dorgan

健全性检查-当容器本身死亡时,是否会删除包含新的对象的stl::container?

  •  0
  • Michael Dorgan  · 技术社区  · 14 年前

    标题几乎涵盖了它。如果我在一个列表中添加了say 3个对象,而该列表超出范围并消失,那么它会在超出范围之前调用每个条目上的delete吗?很肯定是的,但累了,需要做一次清醒检查。

    5 回复  |  直到 14 年前
        1
  •  4
  •   Michael Dorgan    14 年前

    调查显示:我累了,不,他们不会删除主题本身,除非它们在列表本身的某种容器安全智能指针内。午睡时间…

        2
  •  4
  •   wilhelmtell    14 年前

    不,没有STL容器会删除您的指针。这是因为STL容器永远不会拥有您的指针,所以STL容器永远不会承担双重删除的责任。

        3
  •  4
  •   squelart    14 年前

    如果你有 std::list<T> my_list; 然后 my_list 超出范围,每个 T 将删除列表中的对象。

    现在的问题是,您在容器中存储了哪些对象?

    如果容器中有真正的对象,例如 std::list<MyClass> ,对象将被删除,并且 MyClass::~MyClass 他们每个人都会被召唤。

    相反,如果您只有指向对象的指针,例如 std::list<MyClass*> ,指针将被删除,但指向对象将 被删除!

    如果需要存储指向对象的指针,并希望在容器死亡时销毁指向对象的指针,则必须使用一些智能指针(例如 boost::smart_ptr *,这会删除它们的对象,因为指针本身会被删除。或者,在销毁指针容器之前,您需要手动浏览列表并销毁对象,但这更容易出错,并且可能需要额外的工作来确保在发生异常时执行此操作。

    * std::auto_ptr 有一个不寻常的地方 operator=() 与集装箱要求不符。(感谢J-Random-Hacker——请在下面给他+1…)

        4
  •  3
  •   Mark Ransom    14 年前

    不,不会删除对象。

    Boost有一个解决方案, Boost Pointer Container Library . 它不仅为您删除指针,而且还增强了常见操作的语法,使它们更加方便。

        5
  •  0
  •   Prabhu    14 年前

    否。不会对每个项调用“delete”。如果您希望发生这种情况,那么列表应该包含智能指针而不是普通指针。参考 C++ STL vector of pointers . 如果您真的不想在应用程序中出现内存泄漏,那么在列表超出范围之前,需要在每个指针上显式调用delete。