2015-02-05 81 views
3

我在爲MFP編譯的MEX/C代碼中出現奇怪的情況。我使用malloc(...)進行動態內存分配,我呼叫free(...)來釋放此內存。退出MEX程序後,我可以看到分配的內存沒有被釋放。另一方面,如果我使用mxMalloc(...)mxFree(...)一切都很好。我假設malloc(...)的使用是不禁止的,如果我照顧free(...)。在Matlab規範中,我找不到任何有關攔截或阻止基本C庫的信息。雖然有一些奇怪的帖子,像Matlab CentralMatlab是否攔截或攔截MEX/C代碼中的空閒()

+1

「退出MEX程序後,我可以看到分配的內存根本沒有被釋放」 - 是什麼讓你覺得這樣? – 2015-02-05 16:55:34

+0

只要看看Matlab進程,我就可以在我的系統監視器(Linux)中看到它。在我的'MEX'代碼中,我創建了BIG矩陣,並且每次看到爲這些矩陣分配的100 MB以上都由Matlab進程保留。 – 2015-02-06 08:19:59

+0

我認爲你必須展示一些代碼。一個重現問題的最小例子。 – chappjc 2015-02-06 08:33:12

回答

3

它是確定使用mallocfreenewdelete[]太),只是不敢怠慢,首先調用daellocation功能,如果你需要返回早期,因爲一個錯誤,異常,mexErrMsgTxt等等看每returntry/catch block和mexErrMsg*

如果您確定代碼中沒有錯誤,請嘗試clear mex以查看您是否恢復了內存。

此外,我建議以允許您附加調試器的方式構建您的MEX文件。例如,如果您使用的是Windows,則可以按照these instructions的說法直接在Visual Studio中構建,這使得調試變得簡單(只需附加到正在運行的MATLAB.exe)。


UPDATE:解決您的約內存top報道發表評論。您的mex文件正在使用來自MathWorks用於執行mxMallocmxFree的內存管理的不同C運行時庫。請注意,free將內存返回到運行時庫,而不是返回到操作系統。因此,內存可能會在不同的運行時間庫的不同時間返回到操作系統。從Modern Memory Managment at ONLamp.com

malloc通常不會將釋放的內存返回到操作系統;它仍然由這個過程所擁有,直到它終止。該進程可以在下次請求更多內存時重用它,但即使沒有其他內存可用,其他程序也無法訪問它。因此,作爲推論,程序的內存佔用量是任何時候最大分配的大小。

減少分配給進程的內存塊的大小是非常困難的。請參閱this answer。答案重申了一點:「爲了將內存返回到操作系統,首先從這些大塊中分配的所有內存必須釋放到運行時庫中,然後運行時庫可以根據需要告訴操作系統釋放那塊內存。「在那裏也可以看到其他答案。

因此,當free執行時,由top報告的駐留集大小(RSS/RES)不會立即下降,這並不奇怪。 MATLAB內部使用的malloc與mex文件中使用的明顯不同,甚至可能是自定義實現而不是標準運行時版本。

如果是實際的泄漏,你不會得到這個回憶。如果您推送系統,則該內存應該返回到空閒池。但是,我不得不把這算作mxMalloc的益處,而不是malloc,並且聲明我自己並沒有真正轉載此效果。

+0

感謝您的回答。代碼沒有錯誤退出,我已經引入了額外的'try/catch'塊來防止退出而不釋放內存。沒有什麼幫助,即使'清除mex'也不能解決這個問題。似乎'free(...)'在這種情況下根本不起作用......或者被Matlab阻塞。 – 2015-02-06 08:15:27

+0

@VilenJumutc Mex文件是一個共享庫,它使用獨立於MATLAB的C運行時庫。我不認爲MATLAB有任何方法來阻止它。你在看什麼記憶指標? 「ps」或「top」的確切列顯示了這個問題? – chappjc 2015-02-06 08:38:01

+0

我正在看頂部的RES列。 – 2015-02-06 09:19:08