保证释放标准库容器
Guaranteeing standard library containers are freed
假设我有一个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
。 - 这些情况在您编写的任何程序中都应该非常罕见。
相关文章:
- 释放错误后堆使用
- 使用CMake检测支持的C++标准
- 如何理解C++标准N3337中的expr.const.cast子句8
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- G锁定铸造到基础上会释放模拟行为
- 编译标准库类型
- 在将变量声明为引用时,堆在释放后使用
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 铸造标准::有没有回到原来的类型
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 正在理解智能指针,但出现错误:未分配正在释放的指针
- 标准库类型的赋值运算符的引用限定符
- 标准是否严格定义了该程序应该如何编译?
- 如何从Windows应用程序输出到标准?
- 安全到标准:移动会员?
- C++双重释放或损坏(out)
- 保证释放标准库容器