程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 關於C/C++中的內存洩漏——程序員面試高頻題

關於C/C++中的內存洩漏——程序員面試高頻題

編輯:C++入門知識

關於C/C++中的內存洩漏——程序員面試高頻題


 

前幾天面試多益網絡的時候,面試官就問到了C/C++中的內存洩露問題。這也是很多公司面試時候的高頻題,好吧,那就來學習下吧~

到底什麼是內存洩漏?是什麼導致了內存洩漏?如何避免?又如何檢測呢?

 

1)什麼是內存洩漏?

簡單來講,內存洩露是指程序中一塊不再使用的內存沒有被釋放,造成內存保持占用狀態,使操作系統不能將內存分配給其它的程序(進程)。內存洩露不是一個立即會引發故障的錯誤,但是它將消耗系統內存。

2) 什麼導致了內存洩漏?

通過定義很明顯的,我們用malloc/new申請的內存塊,再利用完之後我們忘了free/delete它了,導致內存一直被占用。

下面給出一個小例子:

 

  1. void fun()
  2. {
  3. char *p;
  4. p = (char*)malloc(sizeof(char)*20);
  5. if(NULL !=p)
  6. {
  7. strcpy(p,”hello”);
  8. printf(“p = %s\s”,p);
  9. }
  10. return;
  11. } 這裡面,我們用malloc申請的內存塊,用完之後,沒有用free釋放掉,這樣,最終會造成20個字節的內存洩漏。正確的做法應該是:

     

     

    1. void fun()
    2. {
    3. char *p;
    4. p = (char*)malloc(sizeof(char)*20);
    5. if(NULL !=p)
    6. {
    7. strcpy(p,”hello”);
    8. printf(“p = %s\s”,p);
    9. }
    10. return;
    11. free(p);
    12. }

       

      這樣就可以很好地避免了內存洩漏啦~

      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 ”語句之後就可以了。之後正常編譯、按Debug方式運行被測程序,等程序運行結束時,查閱VC的output窗口,會有“Visual Leak Detector is now exiting.”一句打印信息,在這條件信息之前,如果當前程序沒有內存洩露會有“No memory leaks detected.”信息打印,但如果有內存洩露,將有類似如下信息打印:

       

      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或以上字節的數據,就是溢出。
      
      

       

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved