保证标准库容器被释放

时间:2014-02-18 00:36:29

标签: c++ c++11 stl

假设我有std::vector<std::vector<std::string>>

我目前正在做的是:

std::vector<std::vector<std::string>> obj;
for(auto i:obj) {
    for(auto j:i)
        j.~basic_string();
    i.clear();
}

但这当然只会清除对象并且不会释放它们所拥有的内存。

std::vector是否为自身的基本实例使用任何内存?我如何保证释放这个内存以便它可以用于其他内容,或者这会自动发生吗?

2 个答案:

答案 0 :(得分:4)

您的代码已损坏。当它们仍由容器拥有时,您正在销毁对象。目前尚不清楚您认为自己需要做什么,但不应该做任何事情。这些容器拥有它们包含的对象,当容器被销毁时,其中的所有内容都是如此。

答案 1 :(得分:1)

如果你的容器包含指针,那么你就有责任处理它们的生命周期。否则,你不是。

您目前正在调用undefined behaviour。所涉及的容器负责自己的内存管理 - 它们会破坏自己的内容,导致析构函数运行两次(带有未定义的后果)。

作为一般规则:

  • 如果使用placement new来创建这些对象,则只需要显式调用析构函数。
  • 如果您拨打了delete / free ,则只需致电new / malloc不会将new / malloc的结果传递给旨在自动管理这些分配生命周期的类型。
  • 在您编写的任何课程中,这些情况应该非常罕见。