在代碼塊進入/退出時自動對比進程工作集大小,輸出內存增長/釋放量(KB),快速定位內存洩漏或異常分配。
CAutoMemclass CAutoMem { public: explicit CAutoMem(const char* vInfo) : strInfo(vInfo) { Init(); } ~CAutoMem() { PrintMem(); } private: void Init() { hProcess = GetCurrentProcess(); PROCESS_MEMORY_COUNTERS pmc; GetProcessMemoryInfo(hProcess, &pmc, sizeof(pmc)); dwMemStart = pmc.WorkingSetSize; } void PrintMem() { PROCESS_MEMORY_COUNTERS pmc; GetProcessMemoryInfo(hProcess, &pmc, sizeof(pmc)); long long diff = long long(pmc.WorkingSetSize) - dwMemStart; if (abs(diff) > 1024) { // 僅報告 >1KB 變化 const char* action = diff > 0 ? "內存申請" : "內存釋放"; printf("%s %s %lld KB\n\n", strInfo.c_str(), action, abs(diff) / 1024); } } std::string strInfo; HANDLE hProcess; SIZE_T dwMemStart; };
void testFunction() { CAutoMem memGuard("testFunction: "); // ... 可能分配/釋放內存的代碼 ... vector<int> v(1000000); // 申請 ~4MB } // 作用域結束,自動打印:testFunction: 內存申請 4096 KB
GetCurrentProcess():獲取偽句柄,無需 CloseHandle。GetProcessMemoryInfo:填充 PROCESS_MEMORY_COUNTERS,關鍵字段:
WorkingSetSize:當前物理內存頁數(工作集),最直觀反映內存佔用。PagefileUsage:提交佔用(虛擬內存),含已換出頁面。WorkingSetSize 受系統內存壓力影響會波動,**非精確分配量**,但趨勢明確。PagefileUsage 監測,配合工作集分析虛擬內存行為。dwMemStart,避免內層干擾外層統計。/proc/self/status (VmRSS/VmSize)。malloc/new 分配的虛擬地址空間。