轉:安全起見,小心使用C語言realloc()函數

來源:互聯網
上載者:User

標籤:注意   處理   失敗   錯誤   一個   簡單   語言   calloc   str   

安全起見,小心使用C語言realloc()函數

http://www.360doc.com/content/16/0712/09/19227797_574892368.shtml

在C語言中,良好的編程習慣要求一個函數只做一件事,如果一個函數實現了若干功能,可以說基本是一個糟糕的設計。

C語言 realloc() 函數位於 stdlib.h 標頭檔中,其原型為:
    void *realloc(void *ptr, size_t size);

realloc() 會將 ptr 所指向的記憶體塊的大小修改為 size,並將新的記憶體指標返回。

設之前記憶體塊的大小為 n,如果 size < n,那麼截取的內容不會發生變化,如果 size > n,那麼新分配的記憶體不會被初始化。

如果 ptr = NULL,那麼相當於調用 malloc(size);如果 size = 0,那麼相當於調用 free(ptr)。

如果 ptr 不為 NULL,那麼他肯定是由之前的記憶體配置函數返回的,例如 malloc()、calloc()或realloc()。

如果 ptr 所指的記憶體塊被移動,那麼會調用 free(ptr)。

看吧,一個簡單的 realloc() 卻賦予了好幾個功能,這並不是良好的函數設計。估計也是為了相容性,才容忍這個函數一直在C庫中。雖然在編碼中,realloc() 會提供一定的方便,但是也很容易引發Bug。

下面就舉兩個例子,來說明一下。

1) realloc() 第一種行為引發的Bug

  1. void *ptr = realloc(ptr, new_size);
  2. if (!ptr) {
  3. // 錯誤處理
  4. }

這裡就引出了一個記憶體泄露的問題,當realloc() 分配失敗的時候,會返回NULL。但是參數中的 ptr 的記憶體是沒有被釋放的。如果直接將realloc()的傳回值賦給ptr。那麼當申請記憶體失敗時,就會造成ptr原來指向的記憶體丟失,造成記憶體游離和泄露。

正確的處理應該是這樣:

  1. void *new_ptr = realloc(ptr, new_size);
  2. if (!new_ptr) {
  3. // 錯誤處理。
  4. }
  5. ptr = new_ptr


2) 第三種行為引發的Bug
實際上,malloc(0)是合法的語句,會返還一個合法的指標,且該指標可以通過free去釋放。這就造成了很多人對realloc()的錯誤理解,認為當size為0時,實際上realloc()也會返回一個合法的指標,後面依然需要使用free去釋放該記憶體。

  1. void *new_ptr = realloc(old_ptr, new_size);
  2. //其它代碼
  3. free(new_ptr);

由於錯誤的認識,不去檢驗new_size是否為0,還是按照new_size不為0的邏輯處理,最後並free(new_ptr)。這裡就引入了double free的問題,造成程式崩潰。

所以,realloc() 這個設計並不怎麼優良的函數陷阱還是不少的,一不小心就踩雷了,上面只是兩個簡單的小例子,大家在實際使用的時候還應該注意一些其他小問題。

轉:安全起見,小心使用C語言realloc()函數

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.