内存泄漏标准::矢量管理 C++

memory leak std::vector management c++

本文关键字:管理 C++ 标准 内存 泄漏      更新时间:2023-10-16

当我创建一个 50'000 值的双精度向量时,我遇到了内存泄漏,我不知道为什么。

#include <stdafx.h>
#include <Windows.h>
#include <psapi.h>
#define MEMLOGINIT  double mem1, mem2;
                    PROCESS_MEMORY_COUNTERS_EX pmc;
                    GetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof(pmc));
                    SIZE_T virtualMemUsedByMe = pmc.PrivateUsage;
                    mem1 = virtualMemUsedByMe/1024.0;
                    std::cout << "1st measure n Memory used : " << mem1 <<" Ko.nn";
#define MEMLOG(stepName)    GetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof(pmc));
                            virtualMemUsedByMe = pmc.PrivateUsage; 
                            mem2 = virtualMemUsedByMe/1024.0; 
                            std::cout << stepName << "n Memory used : " << mem2 << " Ko.n Difference with previous measure : " << mem2 - mem1 <<" Ko.nn";
                            mem1 = mem2;

int _tmain(int argc, _TCHAR* argv[])
{   
    MEMLOGINIT;
    {
        vector<double> spTestmemo(50000 ,100.0);
        MEMLOG("measure before destruction");
    }   
    MEMLOG("measure after destruction");
};

具有 50k 值的输出显然,这里没有释放由矢量分配的 400 ko。

但是,析构函数处理 500'000 个值的向量。

int _tmain(int argc, _TCHAR* argv[])
{   
    MEMLOGINIT;
    {
        //vector<double> spTestmemo(50000 ,100.0);
        vector<double> spTestmemo(500000 ,100.0); //instead of the line above
        MEMLOG("measure before destruction");
    }   
    MEMLOG("measure after destruction");
};

具有 500K 值的输出在这里,一个比前一个大十倍的向量几乎被完全破坏(4 ko的小偏差(。

感谢您的帮助。

正如NathanOlivier和PaulMcKenzie在他们的评论中指出的那样,这不是内存泄漏。

释放 c++ std 库时,可能不会向操作系统释放所有内存,但仍会考虑内存。

因此,不要太担心操作系统报告的程序虚拟内存使用情况,只要它在程序运行时没有异常高或持续增加。

---开始特定于Visual Studio:

由于您似乎正在使用Visual Studio构建代码,因此其调试运行时库具有用于执行MEMLOGINIT和MEMLOG宏所执行的操作的工具,请参阅 https://msdn.microsoft.com/en-us/library/974tc9t1.aspx#BKMK_Check_for_heap_integrity_and_memory_leaks

基本上,您可以使用_CrtMemCheckpoint来获取已分配内容的状态,并_CrtMemDifference和_CrtMemDumpStastistics来比较和记录 2 个检查点之间的差异。

运行时库的调试版本还会在程序退出时自动将泄漏的内存转储到程序的调试器控制台。如果将 new 定义为 DEBUG_NEW它甚至会记录进行每次泄漏分配的源文件和行号。这在查找内存泄漏时通常非常有价值。