2012-11-06 125 views
6

在我們的應用程序的模塊之一,calloc()失敗並返回NULL。它試圖分配的內存量是9292字節的結構。操作系統是AIX 7.1並運行VIOS 2.2.1.3。calloc失敗並返回NULL

該機器有2 + GB RAM,似乎沒有內存不足的問題。相同的應用程序模塊在其他一個盒子上運行良好,它與有問題的盒子具有相同的配置。以下是兩個盒子的內存片段,它們是相同的!

週轉箱:

 
RLIMIT_AS  (infinite) (infinite) 
RLIMIT_CORE 1073741312 (infinite) 
RLIMIT_CPU  (infinite) (infinite) 
RLIMIT_DATA  134217728 (infinite) 
RLIMIT_FSIZE (infinite) (infinite) 
RLIMIT_NOFILE  2000 (infinite) 
RLIMIT_RSS  33554432 (infinite) 
RLIMIT_STACK  33554432 2147483646 

疑難BOX:

 
RLIMIT_AS  (infinite) (infinite) 
RLIMIT_CORE 1073741312 (infinite) 
RLIMIT_CPU  (infinite) (infinite) 
RLIMIT_DATA  134217728 (infinite) 
RLIMIT_FSIZE (infinite) (infinite) 
RLIMIT_NOFILE  2000 (infinite) 
RLIMIT_RSS  33554432 (infinite) 
RLIMIT_STACK  33554432 2147483646 

我一無所知無法真正弄清楚爲什麼釋放calloc()甚至沒有關於此框9292個字節。

由於

+0

也許內存碎片?沒有足夠大的空閒塊以適應您的分配?分配失敗時,您是否檢查過'errno'看看它說什麼? –

+0

是的,我在想同樣的事情,但有沒有辦法來證明或具體知道它?錯誤號ENOMEM!桁架輸出顯示此錯誤!從上所述的過程桁架一個片段顯示了本lseek的(3,0,1)\t \t \t \t \t = 4318 lseek的(3,0,1)\t \t \t \t \t = 4318 lseek的(3,0,1)\t \t \t \t \t = 4318 lseek的(3,242,0)\t \t \t \t = 242 kread(3, 「\ Tm值INOR V ersio」 ..,4096)\t = 4096 lseek的(3,0,1 )\t \t \t \t \t = 4338 lseek的(3,222,0)\t \t \t \t = 222 __libc_sbrk(00000000)\t \t \t \t ERR#12 ENOMEM __libc_sbrk(00000000)\t \t \t \t ERR#12 ENOMEM __libc_sbrk(00000000 )\t \t \t \t ERR#12 ENOMEM __libc_sbrk(00000000)\t \t \t \t ERR#12 ENOMEM __L ibc_sbrk(0x00000000)\t \t \t \t Err#12 ENOMEM – k2ibegin

+0

向我們展示代碼,包括對calloc的調用和檢查其結果的代碼。 –

回答

1

嘗試釋放calloc(1,的sizeof(ifp_handle_t));而不是calloc(sizeof(ifp_handle_t),1); 我可能錯了,但你似乎顛倒了參數。

+0

除非你的機器正在填充單個字節,否則不應該有所作爲......但是你是對的,它是'calloc(nmemb,size)'。 – DevSolar

+0

mmm ..我不認爲這是有所作爲,因爲我已經嘗試過使用malloc,也失敗了。而且,相同的代碼工作很長一段時間,只有當客戶創建一個新分區並將AIX 6.1 VIOS分區升級到2.2.1.3時。我懷疑頁面空間不足,或者可能是一些遲到/早期分配相關的事情,這可能是AIX特有的。 – k2ibegin

相關問題