例如,我有字符串的静态声明
std::string s("test");
内存将动态分配给字符串。当字符串s超出作用域时,分配给字符串的内存将被释放?在std::map的情况下
s
std::map
std::map <std::string, std::string> testMap;
类似地,如果这个testMap也超出了作用域,那么std::string的析构函数将被调用,并且string的内存将被释放。评论?提前感谢:)
testMap
std::string
o8x7eapl1#
如果您谈论的是在std::string * 内部 * 进行的动态分配,那么是的,它将被自动解除分配。如果您使用new来分配实际的std::string,那么您需要在之后使用delete。
new
delete
g52tjvyc2#
当使用标准的C++容器时,所有分配的内存都会自动释放,你不必担心自己去做。
dddzy1tm3#
除了已经发布的答案之外,我还必须注意到std::string和std::map(以及其他容器)使用 allocators 进行内存管理。特别是这意味着在deallocate()之后,它们将内存返回给allocator,而不是直接返回给 system,它是分配器(或STL实现)取决于是否返回系统。由于调用系统内存管理(如malloc())可能足够重,* 一些 * 分配器不返回内存,因此如果存在一些预分配的块,下一次调用allocate()会快得多。有时可能会导致各种工具检测到的虚假内存泄漏。
deallocate()
malloc()
allocate()
3条答案
按热度按时间o8x7eapl1#
如果您谈论的是在
std::string
* 内部 * 进行的动态分配,那么是的,它将被自动解除分配。如果您使用
new
来分配实际的std::string
,那么您需要在之后使用delete
。g52tjvyc2#
当使用标准的C++容器时,所有分配的内存都会自动释放,你不必担心自己去做。
dddzy1tm3#
除了已经发布的答案之外,我还必须注意到
std::string
和std::map
(以及其他容器)使用 allocators 进行内存管理。特别是这意味着在deallocate()
之后,它们将内存返回给allocator,而不是直接返回给 system,它是分配器(或STL实现)取决于是否返回系统。由于调用系统内存管理(如malloc()
)可能足够重,* 一些 * 分配器不返回内存,因此如果存在一些预分配的块,下一次调用allocate()
会快得多。有时可能会导致各种工具检测到的虚假内存泄漏。