作者 主題: 關於malloc一定有返回非0值問題...  (閱讀 2851 次)

0 會員 與 1 訪客 正在閱讀本文。

hawkeye

  • 可愛的小學生
  • *
  • 文章數: 9
    • 檢視個人資料
關於malloc一定有返回非0值問題...
« 於: 2007-08-01 10:34 »
大家都知道Linux對記憶體是寫時操作,因此在呼叫malloc的時候會傳回一個線性

位置的指標,但實際上並沒有真的去對實體記憶體操作,因此malloc總是能夠回

傳一個非0的指標,就算目前可用的實體記憶體不夠....

有沒有什麼辦法可以在透過malloc取得記憶體位置後,檢查這個pinter是否真的

能夠存取全部的大小呢?

如果用memset來確定的話....會送出Segmentation fault信號讓程式終止....

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5396
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
關於malloc一定有返回非0值問題...
« 回覆 #1 於: 2007-08-01 10:46 »
你的說法有問題吧.
如果 malloc 不是傳回 null, 就表示你獲得你要的空間大小. 如果空間不夠, 就會傳回 null.

會不會你去 memset 的大小, 超過你實際取得的大小呢? 要不要丟一個你認會有問題的 source code 出來看看呢?

hawkeye

  • 可愛的小學生
  • *
  • 文章數: 9
    • 檢視個人資料
關於malloc一定有返回非0值問題...
« 回覆 #2 於: 2007-08-01 19:26 »
#include "stdio.h"
#include "stdio.h"
#include "stdlib.h"

#define SIZE 100*1024*1024

int main(void)
{
 char *buf;

 buf = malloc(SIZE);

 if (buf)
 {
    memset(buf,0,SIZE);
 }
 free(buf);
}

上面是我的測試程式,我的測試結果是這樣:
 我用free看目前記憶體大小如果大於100M,malloc能夠成功,如果小於就失敗,這很合理,但是如果在malloc成功以後,看free指令的結果,這個malloc並沒有馬上佔用記憶體,而是等到memset以後才會佔用。

這時問題就來了,如果malloc成功以後,memset之前,有其他的process也佔用了記憶體空間,讓空間少於100M,那麼執行到memset的時候就會掛掉了....

所以不知道有沒有什麼方法可以呼叫malloc後,就立刻佔用記憶體,以防這種類似情形發生

kenduest

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3675
    • 檢視個人資料
    • http://kenduest.sayya.org
關於malloc一定有返回非0值問題...
« 回覆 #3 於: 2007-08-01 19:55 »
這個問題以前國外的 linux kernel mailing list 已經討論過了...

其實你的問題答案也在 malloc 的 manpage 內, 您有看過嗎 ?

代碼: [選擇]

       By default, Linux follows an  optimistic  memory  allocation  strategy. This  means  that  when malloc() returns non-NULL there is no guarantee that the memory really is available. This is a really bad bug.  In case  it  turns  out  that the system is out of memory, one or more processes will be killed by the infamous OOM killer.  In case Linux  is  employed under  circumstances  where it would be less desirable to suddenly lose some randomly picked processes, and moreover the kernel version is sufficiently recent, one can switch off this overcommitting behavior using
a command like
              # echo 2 > /proc/sys/vm/overcommit_memory



這樣的話 malloc() 就會如你預期的了..

--
I am kenduest - 小州

my website: http://kenduest.sayya.org/

hawkeye

  • 可愛的小學生
  • *
  • 文章數: 9
    • 檢視個人資料
關於malloc一定有返回非0值問題...
« 回覆 #4 於: 2007-08-02 00:00 »
非常感激,小弟未來會多多在man page琢磨,謝謝