繁体   English   中英

使用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;
}

我认为这是因为实例化Subject类时,STL矢量容器正在堆上使用内存。 程序退出时,如何确保矢量容器被销毁? (我曾尝试删除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} int main(void) {{Subject subject;}_CrtDumpMemoryLeaks(); return 1}

确保Listener析构函数销毁它所需的所有内容。 STL容器所做的所有事情就是调用其持有的对象的析构函数。 在类本身中处理内存仍然是您的责任。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM