[英]Does Matlab blocks or intercepts free() in MEX/C-code
我在為Matlab編譯的MEX / C代碼中有一個奇怪的情況。 我使用malloc(...)
進行動態內存分配,我調用free(...)
來釋放這個內存。 退出MEX例程后,我可以看到分配的內存根本沒有釋放。 另一方面,如果我使用mxMalloc(...)
和mxFree(...)
一切都很好。 我假設如果我照顧free(...)
, malloc(...)
的使用不是禁止的。 在Matlab規范中,我找不到任何關於攔截或阻止基本C庫的信息。 雖然有一些奇怪的帖子,就像在Matlab Central上一樣 。
可以使用malloc
和free
( new
和delete[]
),如果因為錯誤,異常, mexErrMsgTxt
等需要提前返回,請不要忽略調用daellocation函數。看看每一個return
,在代碼中使用try
/ catch
塊和mexErrMsg*
。
如果您確定代碼中沒有錯誤,請嘗試clear mex
以查看是否恢復了內存。
另外,我建議以允許附加調試器的方式構建MEX文件。 例如,如果您使用的是Windows,則可以按照這些說明直接在Visual Studio中進行構建,這樣可以簡化調試(只需連接到正在運行的MATLAB.exe)。
更新 :解決有關top
報告的內存的評論。 您的mex文件使用的是與MathWorks用於實現mxMalloc
和mxFree
的內存管理的不同的C運行時庫。 請注意, free
將內存返回到運行時庫,而不是返回給操作系統 。 結果,可以使用不同的運行時庫在不同的時間將存儲器返回到操作系統。 來自ONLamp.com的現代記憶管理 :
malloc
通常不會將釋放的內存返回給操作系統; 它一直歸進程,直到它終止。 該進程可以在下次請求更多內存時重用它,但即使沒有其他內存可用,其他程序也無法訪問它。 作為必然結果,程序的內存占用量是任何時候最大分配的大小。
眾所周知,減少分配給進程的內存塊的大小是非常困難的。 看到這個答案 。 答案重申了這一點:“要將內存返回給操作系統,首先必須將從這些大塊中的一個分配的所有內存釋放到運行時庫。然后運行時庫可以,如果需要,可以告訴操作系統釋放那塊記憶。“ 在那里也可以看到其他答案。
因此,當free
執行時,由top
報告的駐留集大小(RSS / RES)不會立即下降也就不足為奇了。 MATLAB內部使用的malloc
明顯不同於mex文件中使用的malloc
,甚至可能是自定義實現而不是標准運行時版本。
如果是實際的泄漏,你就不會得到這個記憶。 如果您推送系統,該內存應返回到空閑池。 但是,我必須將此視為mxMalloc
對於malloc
一個好處,免責聲明我自己並沒有實際再現這種效果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.