我得到了內存泄漏,當我創建的雙A 50'000值向量,我不知道爲什麼。內存泄漏的std ::矢量管理C++
#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 50k values 顯然這裏由矢量分配的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");
};
output with 500k values 這裏,大十倍比前一個幾乎完全破壞(4 KO小偏壓)的載體。
感謝您的幫助。
您是否在啓用優化的情況下構建?這可能是編譯器或庫實現的一些優化。 –
我懷疑你在這裏看到內存泄漏。我認爲正在發生的事情是內存塊低於某個特定點,所以操作系統不像第二個例子中那樣回收它。 – NathanOliver
編譯器的堆管理器決定什麼內存回到操作系統。你的場景可能會被'new []/delete []'複製,而不僅僅是'std :: vector'。一般來說,除非該類直接使用OS API調用分配內存,否則不應該依賴OS調用和工具來決定C++類是否泄漏內存,而繞過編譯器的堆管理器。 – PaulMcKenzie