內存泄露檢測方案分析


思路分析

通過重載全局內存申請以及釋放函數,記錄申請和釋放相關信息,在申請時,以申請到的內存地址為key,申請者的相關信息為value,建立映射關系。應用程序主動釋放時,刪除對應的信息。

當整個程序退出時,檢查該map是否為空,如果不為空,則打印出內部信息,即可發現哪里有內存泄露。

概要設計

使用以下宏定義來重定義new


// 外部使用時是這樣進行重定義
#define new DEBUG_MEMORY_LEAK_CHECK_NEW

在泄露檢測工具內部,可以這樣定義:


#if defined(_DEBUG)
	#define	DEBUG_MEMORY_LEAK_CHECK_NEW new(__FILE__, __LINE__)
#else
	#define	DEBUG_MEMORY_LEAK_CHECK_NEW new
#endif

接着,重定義全局申請操作符


void* operator new(size_t size, const char* pFileName, int nLineNum)
{
	void* p = operator new(size);
	if (p)
	{
		// 將內存分配相關信息保存到全局map
	}
}

void operator delete(void* ptr, const char* pFileName, int nLineNum)
{
	// 從全局map中刪除ptr對應的內存分配信息
	free(ptr);
}

注意,在進行重載 operator new 時,它是支持可變參數的,只需要保證第一個參數為 size_t 即可


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM