当我创建50&000; 000值的双倍向量时,我得到了内存泄漏,我不知道为什么。
ID
output with 50k values 显然,这里由向量分配的400 ko不会被释放。
然而,析构函数使用500和#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.\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");
};
output with 500k values 这里,比前一个大十倍的矢量几乎完全被破坏(小偏差为4 ko)。
感谢您的帮助。
答案 0 :(得分:2)
NathanOlivier和PaulMcKenzie在评论中指出,这不是内存泄漏。
当你释放它时,c ++ std库可能无法释放所有内存到操作系统,但内存仍在计算中。
所以,不要过分担心您所看到的操作系统报告的程序虚拟内存使用情况,只要它在程序运行时没有异常高或持续增加。
---开始视觉工作室具体:
由于您似乎使用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,它甚至会记录每次泄漏分配的源文件和行号。在寻找内存泄漏时,这通常非常有价值。