C++ 内存泄漏标准::向量管理c++;

C++ 内存泄漏标准::向量管理c++;,c++,vector,memory-leaks,C++,Vector,Memory Leaks,当我创建一个5万个double值的向量时,我得到了一个内存泄漏,我不知道为什么 #include <stdafx.h> #include <Windows.h> #include <psapi.h> #define MEMLOGINIT double mem1, mem2;\ PROCESS_MEMORY_COUNTERS_EX pmc;\ GetProcessMemoryIn

当我创建一个5万个double值的向量时,我得到了一个内存泄漏,我不知道为什么

#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.\n\n";\

#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.\n\n";\
                            mem1 = mem2;



int _tmain(int argc, _TCHAR* argv[])
{   
    MEMLOGINIT;
    {
        vector<double> spTestmemo(50000 ,100.0);
        MEMLOG("measure before destruction");
    }   
    MEMLOG("measure after destruction");
};
#包括
#包括
#包括
#定义MEMLOGINIT double mem1、mem2\
进程\内存\计数器\ pmc\
GetProcessMemoryInfo(GetCurrentProcess(),(进程内存计数器*)&pmc,sizeof(pmc))\
尺寸\u T虚拟博物馆尺寸=pmc.PrivateUsage\
mem1=virtualMemUsedByMe/1024.0\

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

C++空闲的STD库在释放时可能不会释放所有的内存,但内存仍在考虑。 因此,只要程序运行时虚拟内存使用量不是异常高或持续增加,就不要太担心操作系统报告的程序虚拟内存使用量

---开始特定于visual studio的操作:

由于您似乎是在使用Visual Studio构建代码,因此其调试运行时库提供了一种工具,用于执行您正在使用MEMLOGINIT和MEMLOG宏执行的操作,请参阅

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


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

是否启用了优化功能?这可能是编译器或库实现的一些优化。我怀疑您是否在这里看到内存泄漏。我认为现在的情况是内存块低于某一点,因此操作系统不会像第二个示例中那样回收内存。编译器的堆管理器决定返回操作系统的内存。您的场景可能会通过
new[]/delete[]
复制,而不仅仅是
std::vector
。一般来说,不应该依赖OS调用和工具来判断C++类是否泄漏内存,除非该类直接使用OS API调用分配内存,绕过编译器堆管理器。如果这是实际内存泄漏,则重复该例程应该建立起来。
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");
};