例如,我有字符串
的静态声明std::string s("test");
将为字符串动态分配内存。当字符串s
超出范围时
分配给字符串的内存将被解除分配?
如果是std::map
std::map <std::string, std::string> testMap;
同样,如果此testMap
也超出范围,则调用std::string
的析构函数并释放字符串的内存?
评论? 在此先感谢:)
答案 0 :(得分:5)
如果您正在讨论std::string
内 内的动态分配,那么是的,它会自动解除分配。
如果您使用new
分配实际std::string
,则之后需要使用delete
。
答案 1 :(得分:2)
使用标准C +容器时,将自动释放所有已分配的内存。你不必担心这样做。
答案 2 :(得分:1)
除了已发布的答案之外,我还要注意std::string
和std::map
(以及其他容器)使用 allocators 进行内存管理。特别是这意味着在deallocate()
之后它们将内存返回到分配器,而不是直接返回到 system ,并且它是依赖于分配器(或STL实现)将是否返回到系统。由于调用系统内存管理(如malloc()
)可能足够重,某些分配器不会返回内存,因此如果存在一些预分配的块,则下一次调用allocate()
将会快得多。有时它可能会导致各种工具检测到虚假的内存泄漏。