使用STL容器的C ++内存泄漏

时间:2014-11-18 17:09:53

标签: c++ memory-leaks stl

以下代码给我一个内存泄漏(使用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;
}

我认为这是因为当实例化Subject类时,STL向量容器正在堆上使用内存。当程序退出时,如何确保向量容器被销毁? (我已尝试删除Subject析构函数中的容器,但这似乎无效。)

3 个答案:

答案 0 :(得分:7)

当程序退出时,vector 被销毁,您无需确保它。 需要确保在销毁后调用_CrtDumpMemoryLeaks如果您不希望它将已分配的内存报告为“泄露”:

int main()
{
    { Subject subject; }
    _CrtDumpMemoryLeaks();
    return 1;
}

答案 1 :(得分:2)

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}

答案 2 :(得分:1)

确保Listener析构函数破坏了所需的一切。所有STL容器都会调用它所持有的对象的析构函数。在课堂上处理记忆仍然是你的责任。

更具体地说,类中使用newmalloc声明的任何内容都必须由析构函数释放。 STL容器不知道如何删除它。