前幾天面試多益網絡的時候,面試官就問到了C/C++中的內存洩露問題。這也是很多公司面試時候的高頻題,好吧,那就來學習下吧~
到底什麼是內存洩漏?是什麼導致了內存洩漏?如何避免?又如何檢測呢?
1)什麼是內存洩漏?
簡單來講,內存洩露是指程序中一塊不再使用的內存沒有被釋放,造成內存保持占用狀態,使操作系統不能將內存分配給其它的程序(進程)。內存洩露不是一個立即會引發故障的錯誤,但是它將消耗系統內存。
2) 什麼導致了內存洩漏?
通過定義很明顯的,我們用malloc/new申請的內存塊,再利用完之後我們忘了free/delete它了,導致內存一直被占用。
下面給出一個小例子:
這樣就可以很好地避免了內存洩漏啦~
3) 如何檢測內存洩漏?
當然上面的例子是很簡單的,一眼就可以看出來的。當我們在一個比較大的項目裡面,發生洩漏了,該怎麼找?所以學習一些內存洩漏的檢測方法也是很有必要的。
Visual Leak Detector(VLD)是一款用於Visual C++的免費的內存洩漏檢測工具,該軟件以庫形式與用戶的被測工程一起使用,由於VLD是按LGPL(GNU LESSER GENERAL PUBLIC LICENSE)協議對外開源,所以使用VLD是安全的,不必擔心版權問題。
使用VLD很簡單,只須在包含入口函數的CPP或C文件中把vld.h頭文件包含進來即可。該include語句要求放在最前面,如果當前工程定義預編譯head文件(如stdafx.h),則放在“#include
C:/VcTester21/sample/vc6/SampleMain.c (80): main
crt0.c (206): mainCRTStartup
0x7C816FD7 (File and line number not available): RegisterWaitForInputIdle
Data:
CD CD CD CD CD ........ ........
Visual Leak Detector detected 1 memory leak.
這個信息指明當前發生內存洩露所在的函數及源文件行號,洩露內存塊的地址、長度及當前內存值。用鼠標雙擊指示源碼行的提示信息,VC即自動跳轉到相應代碼行,我們就很方便的知道是哪一行出錯了。
4)相關的內存溢出
既然說到了內存洩露,我們最後還提下內存溢出吧。內存溢出指你申請了10個字節的空間,但是你在這個空間寫入11或以上字節的數據,就是溢出。