C++内存泄漏与unordered_map
C++ memory leaks with unordered_map
我发现我的应用程序中的某个地方有内存泄漏,但我在缩小范围时遇到了麻烦。 我尝试按照此示例中的说明使用函数_CrtDumpMemoryLeaks
,但它不显示文件名。 因此,我一直试图通过在各个点调用此转储函数来找到内存泄漏的第一个点(因为根据输出似乎有很多)。 似乎我在对象的构造函数中很早就得到了很多。
经过进一步调查,我似乎正在为它们提供std::unordered_map
的定义,甚至到了只有一个只声明局部变量的简单 main 函数有内存泄漏的地步。
例如,以下代码生成内存泄漏:
void main()
{
_CrtDumpMemoryLeaks(); // executing this line, no memeory leaks found
std::unordered_map<int, int> intMap;
_CrtDumpMemoryLeaks(); // executing this line, memeory leaks found
}
在这一点上,我完全感到困惑,并觉得追逐这个不会帮助我找到我最初注意到的内存泄漏。
任何帮助都非常感谢。
所以你期望std::unordered_map<T>
在你紧紧抓住一个对象时没有任何内存?这似乎是一个不合理的假设!至少,您应该销毁您创建的对象:
int main()
{
_CrtDumpMemoryLeaks(); // executing this line, no memeory leaks found
{
std::unordered_map<int, int> intMap;
}
_CrtDumpMemoryLeaks(); // executing this line, memeory leaks found
}
我不知道这是否会释放所有内存,但它有更好的机会。标准C++库可能仍在其内存分配机制中保留一些内存池。
除了"已分配但尚未释放的内存"之外,内存泄漏的定义是什么?
如果 unordered_map
构造函数在内部分配任何内存,那么您就有了"泄漏"。尝试将其放在自己的范围内,看看是否得到相同的结果。
只有在释放了分配的所有内容后,调用_CrtDumpMemoryLeaks
才有意义。
如其他答案所述,您的作用域中有一个unordered_map
,并且此对象已分配内存。一旦它消失了,分配就会随之而去。所以把它包装在一个范围内!
相关文章:
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 使用一个考虑到std::map中键值的滚动或换行的键
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 允许从 std::map 的密钥窃取资源?
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将重物插入std::map
- 使用通用值初始化 std::map,不重复
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- C++:当所有条目都保证是唯一时,替代 std::map
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- 使用字符数组作为 Map 中的键
- C++如何创建 std::map
- C++ equivalent to Java Map getOrDefault?
- 从其他容器中移动构造"std::map"
- 如何使用 uint64_t 键类型从 std::map<int, std::string> 返回值?
- 将 std::map::emplace 与返回 shared_ptr 的函数一起使用是否正确?
- C++中 std::map 的运行时复杂度是多少?
- unordered map -在c++ std::unordered_map中预分配桶