使用 STL 容器C++内存泄漏
C++ Memory Leak Using STL Containers
下面的代码给了我一个内存泄漏(使用Visual Studio):
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#include <vector>
#include <memory>
struct Listener {};
struct Subject
{
std::vector<Listener*> listeners;
};
int main(void)
{
Subject subject;
_CrtDumpMemoryLeaks();
return 1;
}
我认为这是因为 STL 向量容器在实例化 Subject
类时正在使用堆上的内存。如何确保在程序退出时销毁向量容器?(我尝试删除Subject
析构函数中的容器,但这似乎不起作用)。
程序退出时vector
被销毁,您无需确保它。如果您不希望_CrtDumpMemoryLeaks
将分配的内存报告为"泄漏",则确实需要确保在销毁后调用它:
int main()
{
{ Subject subject; }
_CrtDumpMemoryLeaks();
return 1;
}
std::vector<Listener*> listeners;
不会释放侦听器的成员。您必须删除向量中的每个侦听器,如下所示:
for (int i = 0; i < listeners.size(); i++) delete listeners[i]
就个人而言,我通过使用智能指针来避免此类问题:
std::vector<std::unique_ptr<Listener>> listeners
_CrtDumpMemoryLeaks通过计算新闻并确保它们都匹配来检测泄漏。因为主题永远不会超出范围,我猜它算作一个杰出的参考。试试int main(void) {{Subject subject;}_CrtDumpMemoryLeaks(); return 1}
确保 Listener
析构函数销毁它需要的一切。STL 容器所做的只是调用它所持有的对象的析构函数。处理类本身的内存仍然是您的责任。
更具体地说,析构函数必须释放类中用 new
或 malloc
声明的任何内容。STL 容器不知道如何删除它。
相关文章:
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 尽管遵循了规则,内存泄漏在哪里
- 为什么调用堆栈数组会导致内存泄漏
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 使用模板类的自定义列表类型中的内存泄漏
- 为什么以下C++代码中存在内存泄漏?
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 我是否生成线程并导致内存泄漏?
- 多线程程序中出现意外的内存泄漏
- 为什么此函数会导致内存泄漏?
- 在 C++ 库中使用cythonized python时内存泄漏
- 需要帮助查找内存泄漏
- 瓦尔格林德的内存泄漏使用新的
- 无法找出我的代码中的内存泄漏
- C++ 结构内部的unordered_map会导致内存泄漏问题吗?
- 可视化 使用 VS Code 查找C++应用程序中的内存泄漏
- Shared_ptr双链接列表内存泄漏
- C++ 在类中使用常量引用文本时 O2 内存泄漏