記憶體釋放的重要性

來源:互聯網
上載者:User

      c/c++編譯器對程式佔用的記憶體配置可分為以下幾個部分:
1、棧區(stack):由編譯器自動分配釋放,存放函數的參數值,局部變數的值等。其操作方式類似於資料結構中的棧。
2、堆區(heap):一般由程式員分配釋放,若程式員不釋放,程式結束時可能由OS回收。注意它與資料結構中的堆是兩回事,分配方式倒是類似於鏈表。
3、全域區(靜態區)(static):全域變數和靜態變數的儲存是放在一塊的,初始化的全域變數和靜態變數在一塊地區,未初始化的全域變數和未初始化的靜態變數在相鄰的另一塊地區。程式結束後有系統釋放。
4、文字常量區:常量字串就是放在這裡的。程式結束後由系統釋放。
5、程式碼區:存放函數體的二進位代碼。

     在用C/C++編程時,我們跟堆打交道的多,且要特小心啊。對於堆來說,釋放工作由程式員控制,容易產生memory leak。一般使用malloc/calloc --  free;new and delete 來對堆進行操作。一個非常重要的規則就是:開闢的空間一定要在程式結束後把空間釋放掉。因為釋放避免了記憶體流失,又可以檢測到記憶體申請空間太小或對記憶體越界錯誤。

     在一次項目中,在init function 中,malloc 了很多空間,然後完成一切相關的操作,且一切正常,結果也正確,但在uninit function中,對空間進行釋放時,就出現在以下錯誤:

     DAMAGE: after Normal block (#4826967) at 0x2000E148。

  

    進行相關的debug,問題發現了。

void initialize_input_buffer(
  PARAM *in_buffer
  )
{
       //int i;
       in_buffer->voice_flag = 0;
       in_buffer->input_len = 128;
       in_buffer->num_vad = 0;
       if((in_buffer->input = (short *)(calloc((unsigned)128, sizeof(short)))) == NULL)
       {
        printf("Failed malloc space operate!\n");
       }     
}

      在init中,我申請了128 short空間,但在使用中,由於一些狀態沒控制好的原因,對這個buffer寫了192個short資料,操作過程中,剛好碰到結果正確,但這種情況很危險,這是屬於超界操作。在free時,就出現上面那個錯誤。

      在這就寫這一些,與些問題相關有一個文章寫得更加詳細,在此作下連結啊。

http://blog.csdn.net/ablenavy/archive/2008/06/01/2500678.aspx

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.