最近在寫一個界面程式。用MFC來寫的,因為涉及到對相機的標定,所以用到了Matlab的支持庫。Matlab那邊的庫是同事寫的,我界面這邊負責呼叫,運行出結果就可以了。但是在程式運行的程序中,發現出現記憶體泄露的問題。多方排查之后定位到了是我同事基于Matlab寫的標定庫那邊出現的記憶體泄露。但詳細溝通之后,得到的答復是Matlab那邊沒有申請記憶體的代碼,也不確定用到的Matlab庫函式是否有申請到記憶體。所以也無法提供釋放操作。這就導致了現在整個程式運行之后記憶體無法釋放的問題,而且隨著運行次數的增加,記憶體還會不斷的增加。只有關掉整個程式記憶體才會恢復正常。在測驗的程序意外發現騰訊管家能夠在我程式還在運行的時候把我程式那部分泄露的記憶體釋放掉。所以想問一下騰訊管家之類的這種軟體是怎么做到釋放第三方程式申請的記憶體的,我能不能借鑒一下解決我這個情況?而對于這種呼叫第三方庫出現記憶體泄露的情況,有沒有具體的解決方法?或者有沒有Matlab大佬能夠提供一下解決記憶體泄露的方法。
uj5u.com熱心網友回復:
僅供參考 matlab 記憶體管理 清理記憶體uj5u.com熱心網友回復:
先把matlab模塊注釋掉,如果沒記憶體泄露了說明肯定這個模塊有記憶體泄露,如果注釋掉還有記憶體泄露說明你自己代碼有記憶體泄露,縮小范圍一步一步排查uj5u.com熱心網友回復:
記憶體泄露問題通常對長期運行(數天)的程式才比較嚴重,因為 短期運行的程式退出后,系統會釋放 其 記憶體。uj5u.com熱心網友回復:
不了解matlab,但是你自己程式的記憶體泄露,第三方殺毒軟體是無法做到幫你釋放的!而且還能保證你程式正常運行。否則這功能算是漏洞了。這病毒要是寫出來可強大了。uj5u.com熱心網友回復:
你自己申請的記憶體,騰訊管家好像不能分析吧,除非matlab 的 dll運行后退出了,new出來又沒有釋放的記憶體可以通過類似軟體回收。uj5u.com熱心網友回復:
我感徑訓是要解決matlab庫記憶體泄漏的問題,找什么騰訊管家這曲線繞的有點大。如果你證據確鑿就不容別人狡辯。或者你讓他提供呼叫庫的demo程式,看他自己的程式呼叫會不會記憶體泄漏。我自己封裝matlab庫時,發現需要主動釋放記憶體的情況很多。
如:
emxArray_real_T *X;
。。。。
emxDestroyArray_real_T(X);
uj5u.com熱心網友回復:
這個確實是matlab的問題,但情況不是new出來的東西沒有釋放的問題,經過了一個多月的不斷優化和排查,現在整個程式記憶體的疊加泄露問題已經得到解決,但是還有一處記憶體泄露已經定位了,但還是沒有辦法解決,那就是呼叫初始化函式的時候導致的記憶體泄露問題。但由于初始化函式只是呼叫一次,所以導致的記憶體泄露不算嚴重,而且也能用騰訊管家之類的軟體釋放那部分記憶體。所以現在我們就暫時放著這個問題先不去解決,后期有辦法再嘗試解決。uj5u.com熱心網友回復:
現在能夠確定是matlab的問題導致的記憶體泄露,而且能夠定位到出問題的函式就是初始化函式“函式名Initialize();”這個函式,但是我同事那邊說他也不知道怎么解決。但由于泄露的不是特別嚴重且初始化只呼叫一次,我們就暫時不去處理這個問題了。你有遇到類似的情況嗎?有沒有好的解決辦法?uj5u.com熱心網友回復:
函式呼叫完后,結束函式呼叫了嗎?
比如:
PumpModel_Nlinfit_mFcnInitialize();
PumpModel_Nlinfit_mFcn();
PumpModel_Nlinfit_mFcnTerminate();
uj5u.com熱心網友回復:
現在能夠確定是matlab的問題導致的記憶體泄露,而且能夠定位到出問題的函式就是初始化函式“函式名Initialize();”這個函式,但是我同事那邊說他也不知道怎么解決。但由于泄露的不是特別嚴重且初始化只呼叫一次,我們就暫時不去處理這個問題了。你有遇到類似的情況嗎?有沒有好的解決辦法?
我感徑訓是要解決matlab庫記憶體泄漏的問題,找什么騰訊管家這曲線繞的有點大。如果你證據確鑿就不容別人狡辯。或者你讓他提供呼叫庫的demo程式,看他自己的程式呼叫會不會記憶體泄漏。
我自己封裝matlab庫時,發現需要主動釋放記憶體的情況很多。
如:
emxArray_real_T *X;
。。。。
emxDestroyArray_real_T(X);
函式呼叫完后,結束函式呼叫了嗎?
比如:
PumpModel_Nlinfit_mFcnInitialize();
PumpModel_Nlinfit_mFcn();
PumpModel_Nlinfit_mFcnTerminate();
由于我們這邊的代碼邏輯需要每次呼叫功能函式(PumpModel_Nlinfit_mFcn();)之前先呼叫一遍初始化函式(PumpModel_Nlinfit_mFcnInitialize();)如果我每次用完功能函式之后呼叫釋放函式,下一次回圈再呼叫初始化函式的時候由于系統誤以為上一次已經釋放了所以會再次申請記憶體,但事實上上一次呼叫釋放函式并沒有任何效果,所以會導致記憶體的不斷申請疊加,記憶體泄露會越來越大。但如果我們申請了一次之后再也不呼叫釋放函式,那么下一次再呼叫申請函式的時候也就不會再次申請了,反倒不會出現記憶體泄露疊加的情況。我們就是通過去掉這個釋放函式(PumpModel_Nlinfit_mFcnTerminate();)解決掉了記憶體疊加的問題的。
uj5u.com熱心網友回復:
最后一個結束釋放的函式(PumpModel_Nlinfit_mFcnTerminate();)我們一開始呼叫過了,但非但沒有任何效果反而導致了一開始的疊加問題,其實作在想想導致問題的根本原因應該是釋放函式沒有效果導致的。
現在能夠確定是matlab的問題導致的記憶體泄露,而且能夠定位到出問題的函式就是初始化函式“函式名Initialize();”這個函式,但是我同事那邊說他也不知道怎么解決。但由于泄露的不是特別嚴重且初始化只呼叫一次,我們就暫時不去處理這個問題了。你有遇到類似的情況嗎?有沒有好的解決辦法?
我感徑訓是要解決matlab庫記憶體泄漏的問題,找什么騰訊管家這曲線繞的有點大。如果你證據確鑿就不容別人狡辯。或者你讓他提供呼叫庫的demo程式,看他自己的程式呼叫會不會記憶體泄漏。
我自己封裝matlab庫時,發現需要主動釋放記憶體的情況很多。
如:
emxArray_real_T *X;
。。。。
emxDestroyArray_real_T(X);
函式呼叫完后,結束函式呼叫了嗎?
比如:
PumpModel_Nlinfit_mFcnInitialize();
PumpModel_Nlinfit_mFcn();
PumpModel_Nlinfit_mFcnTerminate();
由于我們這邊的代碼邏輯需要每次呼叫功能函式(PumpModel_Nlinfit_mFcn();)之前先呼叫一遍初始化函式(PumpModel_Nlinfit_mFcnInitialize();)如果我每次用完功能函式之后呼叫釋放函式,下一次回圈再呼叫初始化函式的時候由于系統誤以為上一次已經釋放了所以會再次申請記憶體,但事實上上一次呼叫釋放函式并沒有任何效果,所以會導致記憶體的不斷申請疊加,記憶體泄露會越來越大。但如果我們申請了一次之后再也不呼叫釋放函式,那么下一次再呼叫申請函式的時候也就不會再次申請了,反倒不會出現記憶體泄露疊加的情況。我們就是通過去掉這個釋放函式(PumpModel_Nlinfit_mFcnTerminate();)解決掉了記憶體疊加的問題的。
按照我的理解,如果你們的呼叫函式只有一個的話,應該可以程式啟動時呼叫一次Initialize,程式結束時呼叫一次Terminate,多個就不清楚了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/25219.html
標籤:界面
上一篇:c++11
下一篇:在使用Microsoft Communications Control, version 6.0控制元件時出現的wen'ti
