C++ 保证释放标准库容器

C++ 保证释放标准库容器,c++,c++11,stl,C++,C++11,Stl,假设我有一个std::向量 我目前正在做的是: std::vector<std::vector<std::string>> obj; for(auto i:obj) { for(auto j:i) j.~basic_string(); i.clear(); } 但这当然只会清除对象,而不会释放它们所持有的内存 vector本身的基本实例是否使用任何内存?我怎样才能保证这个内存被释放,这样它就可以用于其他事情,或者这会自动发生 您的代码已损

假设我有一个std::向量

我目前正在做的是:

std::vector<std::vector<std::string>> obj;
for(auto i:obj) {
    for(auto j:i)
        j.~basic_string();
    i.clear();
}
但这当然只会清除对象,而不会释放它们所持有的内存


vector本身的基本实例是否使用任何内存?我怎样才能保证这个内存被释放,这样它就可以用于其他事情,或者这会自动发生

您的代码已损坏。您正在销毁仍属于容器的对象。不清楚你认为你需要做什么,但你不应该做任何事情。这些容器拥有它们所包含的对象,当容器被销毁时,容器中的所有东西都会被销毁。

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

您当前正在调用未定义的行为。所涉及的容器负责它们自己的内存管理——它们将销毁它们自己的内容,您将导致析构函数运行两次,并产生未定义的后果

作为一般规则:

只有在使用placement new创建这些对象时,才需要显式调用析构函数。 如果您调用了new/malloc,并且没有将new/malloc的结果传递给设计用于自动管理这些分配的生存期的类型,则只需要调用delete/free。 这些情况在您编写的任何程序中都应该非常罕见。
你为什么这么做?你实际上触发了未定义的行为。如果我用new创建它,基本std::vector可能会自己清理,但是第二级的呢?请看我的答案。这些容器拥有它们所包含的对象。当容器被销毁时,它所拥有的一切也都被销毁了。容器只拥有指针,关键是要销毁对象,这样我才能找回内存。在这之后就不会使用了。容器在运行时不调用析构函数freed@Nowayz容器只拥有指针什么指针?您的代码中没有指针。@Nowayz,这些指针在被销毁时由这些内部成员拥有并适当清理。@Nowayz这些库的全部意义在于您不必关心内部数据结构是什么样的。您只需要使用公共接口。是的,分配的空间可能是,但不是子对象的子对象