C++中std::string中已分配内存的释放

cwxwcias  于 2023-01-06  发布在  其他
关注(0)|答案(3)|浏览(583)

例如,我有字符串的静态声明

std::string s("test");

内存将动态分配给字符串。当字符串s超出作用域时,分配给字符串的内存将被释放?
std::map的情况下

std::map <std::string, std::string> testMap;

类似地,如果这个testMap也超出了作用域,那么std::string的析构函数将被调用,并且string的内存将被释放。
评论?提前感谢:)

o8x7eapl

o8x7eapl1#

如果您谈论的是在std::string * 内部 * 进行的动态分配,那么是的,它将被自动解除分配。
如果您使用new来分配实际的std::string,那么您需要在之后使用delete

g52tjvyc

g52tjvyc2#

当使用标准的C++容器时,所有分配的内存都会自动释放,你不必担心自己去做。

dddzy1tm

dddzy1tm3#

除了已经发布的答案之外,我还必须注意到std::stringstd::map(以及其他容器)使用 allocators 进行内存管理。特别是这意味着在deallocate()之后,它们将内存返回给allocator,而不是直接返回给 system,它是分配器(或STL实现)取决于是否返回系统。由于调用系统内存管理(如malloc())可能足够重,* 一些 * 分配器不返回内存,因此如果存在一些预分配的块,下一次调用allocate()会快得多。有时可能会导致各种工具检测到的虚假内存泄漏。

相关问题