2012-03-13 63 views
-3

我正在移植一個使用opengl構建的c遊戲,用於移植原因。一切都很順利,直到出於某些原因,遊戲的malloc功能停止工作。函數malloc返回NULL ...但只有10次第一次

我一直在尋找這個答案。我發現的唯一的事情是malloc返回NULL。一個非常簡單的malloc,創建一個簡單的幾個字節的結構。

我做了一些嘗試,我在一個循環內編寫了命令。而我的驚喜是,它在前10次都失敗了,但之後命令奏效了,比賽開始了。之後,該結構已經創建好幾次,沒有問題。

我會說要保持原樣,但我確定後面有問題,並且在其他系統中可能無法正常工作。這就是爲什麼我想問我有什麼樣的問題,爲什麼以及如何避免它。環境不是非常友好,我缺乏調試工具,所以我希望儘可能多的細節。

謝謝。編號: 代碼很簡單。

ObjectBase* newcoin; 
newcoin= (ObjectBase*)calloc(1,sizeof(ObjectBase)); 

而ObjectBase結構非常小。不超過200字節。

硬件是一個基於Windows 7的計算機,具有4 GB或內存。即使這樣,錯誤是:

Visual C++ CRT: Not enough memory to complete call to strerror 

它工作正常之前。 更多問題。從磁盤加載文件時遇到同樣的問題。它發生約10到15次,然後正常工作。 問題總是在發生。每次我重新啓動應用程序,它都會崩潰。

+1

請添加一些重要的代碼。那樣我們就無法判斷。 – DonCallisto 2012-03-13 19:49:55

+3

你的環境是什麼(硬件,操作系統,編譯器)?你可以發佈一些代碼嗎?問題是否完全可重現?這是不太可能的,但可能的情況是可用內存的數量實際上正在變化,這取決於還在運行的是什麼。 – 2012-03-13 19:50:55

+0

郵政編碼請 – Dan 2012-03-13 19:52:02

回答

0

使用valgrind來調試程序中可能的內存泄漏。

如果你檢查你的程序沒有泄漏或行爲不端w.r.t. malloc,可能發生malloc返回NULL,因爲沒有可用的內存。

它甚至可能發生malloc返回null,則一些第三方庫釋放一些內存free,然後malloc可能會再次給你一些新鮮的記憶。

您可能還會考慮使用Boehm's conservative garbage collector,它使用GC_malloc而不是malloc,而不會打擾多餘的空閒內存。

如果在Linux上,使用/proc僞文件系統,以瞭解你的進程(例如/proc/1234/maps爲PID 1234,也/proc/self/maps從過程裏面,/proc/self/statm等過程)。另請參閱pmap命令。

+0

我很抱歉地說我不能依賴它,因爲我必須將應用程序移植到幾個不支持這些庫的系統。我唯一可以說的是,在移植到opengl之前這是工作的,唯一改變的是使用opengl的結構的名稱。完全沒有理由要求更多的內存,特別是因爲應用程序只使用大約30MB的內存。 – user1267350 2012-03-13 20:34:38

+0

你肯定可以在某些系統上使用'valgrind'來調試一些內存泄漏(這些泄漏很可能在你的代碼中,所以不依賴於系統)。 – 2012-03-13 20:35:49

相關問題