保证释放标准库容器

Guaranteeing standard library containers are freed

本文关键字:标准 释放      更新时间:2023-10-16

假设我有一个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是否将任何内存用于自身的基本实例? 我如何保证释放此内存,以便它可以用于其他事情,还是会自动发生?

你的代码坏了。您正在销毁对象,而这些对象仍由容器拥有。目前还不清楚你认为你需要做什么,但你不应该做任何事情。这些容器拥有它们包含的对象,当容器被销毁时,其中的所有内容也会被销毁。

如果您的容器包含指针,那么您负责处理它们的生存期。否则,你不是。

您当前正在调用undefined behaviour 。所涉及的容器负责自己的内存管理 - 它们将销毁自己的内容,您会导致析构函数运行两次(后果不明)。

作为一般规则:

  • 仅当您使用放置 new 来创建这些对象时,才需要显式调用析构函数。
  • 如果您调用了new/malloc并且未将new/malloc的结果传递给旨在自动为您管理这些分配的生存期的类型,则只需调用delete/free
  • 这些情况在您编写的任何程序中都应该非常罕见。