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

C++ Memory Leak Using STL Containers

本文关键字:内存 泄漏 C++ 容器 STL 使用      更新时间:2023-10-16

下面的代码给了我一个内存泄漏(使用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 容器所做的只是调用它所持有的对象的析构函数。处理类本身的内存仍然是您的责任。

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