我在爲MFP編譯的MEX/C代碼中出現奇怪的情況。我使用malloc(...)
進行動態內存分配,我呼叫free(...)
來釋放此內存。退出MEX程序後,我可以看到分配的內存沒有被釋放。另一方面,如果我使用mxMalloc(...)
和mxFree(...)
一切都很好。我假設malloc(...)
的使用是不禁止的,如果我照顧free(...)
。在Matlab規範中,我找不到任何有關攔截或阻止基本C庫的信息。雖然有一些奇怪的帖子,像Matlab Central。Matlab是否攔截或攔截MEX/C代碼中的空閒()
回答
它是確定使用malloc
和free
(new
和delete[]
太),只是不敢怠慢,首先調用daellocation功能,如果你需要返回早期,因爲一個錯誤,異常,mexErrMsgTxt
等等看每return
,try
/catch
block和mexErrMsg*
。
如果您確定代碼中沒有錯誤,請嘗試clear mex
以查看您是否恢復了內存。
此外,我建議以允許您附加調試器的方式構建您的MEX文件。例如,如果您使用的是Windows,則可以按照these instructions的說法直接在Visual Studio中構建,這使得調試變得簡單(只需附加到正在運行的MATLAB.exe)。
UPDATE:解決您的約內存top
報道發表評論。您的mex文件正在使用來自MathWorks用於執行mxMalloc
和mxFree
的內存管理的不同C運行時庫。請注意,free
將內存返回到運行時庫,而不是返回到操作系統。因此,內存可能會在不同的運行時間庫的不同時間返回到操作系統。從Modern Memory Managment at ONLamp.com:
malloc
通常不會將釋放的內存返回到操作系統;它仍然由這個過程所擁有,直到它終止。該進程可以在下次請求更多內存時重用它,但即使沒有其他內存可用,其他程序也無法訪問它。因此,作爲推論,程序的內存佔用量是任何時候最大分配的大小。
減少分配給進程的內存塊的大小是非常困難的。請參閱this answer。答案重申了一點:「爲了將內存返回到操作系統,首先從這些大塊中分配的所有內存必須釋放到運行時庫中,然後運行時庫可以根據需要告訴操作系統釋放那塊內存。「在那裏也可以看到其他答案。
因此,當free
執行時,由top
報告的駐留集大小(RSS/RES)不會立即下降,這並不奇怪。 MATLAB內部使用的malloc
與mex文件中使用的明顯不同,甚至可能是自定義實現而不是標準運行時版本。
如果是實際的泄漏,你不會得到這個回憶。如果您推送系統,則該內存應該返回到空閒池。但是,我不得不把這算作mxMalloc
的益處,而不是malloc
,並且聲明我自己並沒有真正轉載此效果。
感謝您的回答。代碼沒有錯誤退出,我已經引入了額外的'try/catch'塊來防止退出而不釋放內存。沒有什麼幫助,即使'清除mex'也不能解決這個問題。似乎'free(...)'在這種情況下根本不起作用......或者被Matlab阻塞。 – 2015-02-06 08:15:27
@VilenJumutc Mex文件是一個共享庫,它使用獨立於MATLAB的C運行時庫。我不認爲MATLAB有任何方法來阻止它。你在看什麼記憶指標? 「ps」或「top」的確切列顯示了這個問題? – chappjc 2015-02-06 08:38:01
我正在看頂部的RES列。 – 2015-02-06 09:19:08
- 1. 攔截器不攔截
- 2. java攔截器不攔截
- 3. EJB 3.1攔截器是「攔截器」嗎?
- 4. android上的攔截攔截器
- 5. 如何爲ILogger攔截攔截器
- 6. 城堡攔截器不攔截
- 7. LightInject - 攔截不攔截依賴關係
- 8. EJB攔截器vs CDI攔截器
- 9. struts2的攔截
- 10. 的RESTEasy攔截
- 11. 如何在C++代碼中攔截printf()?
- 12. 如何使用Spring攔截或過濾器攔截資源
- 13. 攔截器攔截不C#,城堡動態代理
- 14. 攔截localStorage.getItem()
- 15. 攔截出口
- 16. Response.Redirect攔截
- 17. 攔截在OSX
- 18. jquery攔截
- 19. HTTPS攔截
- 20. 攔截忽略
- 21. 攔截異常
- 22. Golang smtp.SendMail攔截
- 23. Angularjs - 在攔截
- 24. UINavigationController攔截 - popViewControllerAnimated:
- 25. StructureMap攔截器
- 26. EJB3攔截器
- 27. SOAPUI SSL攔截
- 28. Ninject攔截
- 29. 攔截didAddSubview
- 30. 攔截只DynamicProxy
「退出MEX程序後,我可以看到分配的內存根本沒有被釋放」 - 是什麼讓你覺得這樣? – 2015-02-05 16:55:34
只要看看Matlab進程,我就可以在我的系統監視器(Linux)中看到它。在我的'MEX'代碼中,我創建了BIG矩陣,並且每次看到爲這些矩陣分配的100 MB以上都由Matlab進程保留。 – 2015-02-06 08:19:59
我認爲你必須展示一些代碼。一個重現問題的最小例子。 – chappjc 2015-02-06 08:33:12