簡體   English   中英

Matlab是否阻止或攔截MEX / C代碼中的free()

[英]Does Matlab blocks or intercepts free() in MEX/C-code

我在為Matlab編譯的MEX / C代碼中有一個奇怪的情況。 我使用malloc(...)進行動態內存分配,我調用free(...)來釋放這個內存。 退出MEX例程后,我可以看到分配的內存根本沒有釋放。 另一方面,如果我使用mxMalloc(...)mxFree(...)一切都很好。 我假設如果我照顧free(...)malloc(...)的使用不是禁止的。 在Matlab規范中,我找不到任何關於攔截或阻止基本C庫的信息。 雖然有一些奇怪的帖子,就像在Matlab Central上一樣

可以使用mallocfreenewdelete[] ),如果因為錯誤,異常, mexErrMsgTxt等需要提前返回,請不要忽略調用daellocation函數。看看每一個return ,在代碼中使用try / catch塊和mexErrMsg*

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

另外,我建議以允許附加調試器的方式構建MEX文件。 例如,如果您使用的是Windows,則可以按照這些說明直接在Visual Studio中進行構建,這樣可以簡化調試(只需連接到正在運行的MATLAB.exe)。


更新 :解決有關top報告的內存的評論。 您的mex文件使用的是與MathWorks用於實現mxMallocmxFree的內存管理的不同的C運行時庫。 請注意, free將內存返回到運行時庫,而不是返回給操作系統 結果,可以使用不同的運行時庫在不同的時間將存儲器返回到操作系統。 來自ONLamp.com的現代記憶管理

malloc通常不會將釋放的內存返回給操作系統; 它一直歸進程,直到它終止。 該進程可以在下次請求更多內存時重用它,但即使沒有其他內存可用,其他程序也無法訪問它。 作為必然結果,程序的內存占用量是任何時候最大分配的大小。

眾所周知,減少分配給進程的內存塊的大小是非常困難的。 看到這個答案 答案重申了這一點:“要將內存返回給操作系統,首先必須將從這些大塊中的一個分配的所有內存釋放到運行時庫。然后運行時庫可以,如果需要,可以告訴操作系統釋放那塊記憶。“ 在那里也可以看到其他答案。

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

如果是實際的泄漏,你就不會得到這個記憶。 如果您推送系統,該內存應返回到空閑池。 但是,我必須將此視為mxMalloc對於malloc一個好處,免責聲明我自己並沒有實際再現這種效果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM