Ogre與MFC結合時的記憶體洩漏問題

2021-05-21 20:06:32 字數 2145 閱讀 7487

剛開始使用ogre時總是碰到記憶體洩露,而且往往是一洩千里,等半分鐘才能打完日誌,我想這和ogre中的大量大物件很有關係。下面就來分析一下記憶體洩露的產生原因。

1. mfc中使用ogre時發生的記憶體洩露

這個問題比較有意思,其實並沒有發生洩露,而是mfc自作主張的認為發生了記憶體洩露,實際上記憶體並不是沒有釋放,而是在vc報記憶體洩露之後釋放,先來看一看mfc報記憶體洩露時的呼叫堆疊:

msvcr71d.dll!_crtdumpmemoryleaks() 行2208 c

mfc71d.dll!_afx_debug_state::~_afx_debug_state() 行127 c++

mfc71d.dll!_afx_debug_state::`scalar deleting destructor'() + 0xf c++

mfc71d.dll!cprocesslocalobject::~cprocesslocalobject() 行472 + 0x26 c++

mfc71d.dll!cprocesslocal<_afx_debug_state>::~cprocesslocal<_afx_debug_state>() + 0xf c++

mfc71d.dll!$e10() + 0xd c++

mfc71d.dll!_crt_init(void * hdllhandle=0x7c140000, unsigned long dwreason=0, void * lpreserved=0x00000001) 行234 c

mfc71d.dll!_dllmaincrtstartup(void * hdllhandle=0x7c140000, unsigned long dwreason=0, void * lpreserved=0x00000001) 行288 + 0x11 c

afx_debug_state的析構函式:

_afx_debug_state::~_afx_debug_state()

很顯然crtdumpmemoryleaks()是在mfc71d.dll解除安裝時被呼叫的,如果這個時候ogremain_d.dll還沒有解除安裝,那麼在ogre中new的全域性變數也就還沒有釋放,所以mfc會認為產生了記憶體洩露。如何處理這樣的問題呢。很簡單,讓ogremain_d.dll在mfc71d.dll之前析構,但是預設的mfc程式似乎不是這樣幹的(為什麼呢?),這就要求對專案設定作一點調整,使得mfc71d.dll在ogremian之前被鏈結,這樣程式執行時mfc71d就會早於ogre載入,也就晚於ogre解除安裝。具體設定如下:

i) in the general tab, switch "usemfcin a shared dll" to "use standard windows libraries"

ii) in the c/c++/preprocessor tab, add _afxdll to the preprocessor definitions

iii) in the linker/input tab, add mfc80d.lib anywhere before ogremain_d.lib

另一種方法是,使用ogre自己的memorymanager,並且禁止呼叫mfc的debug_new,這需要先

#define ogre_debug_memory_manager 1

然後刪除cpp中的以下行

#ifdef _debug

#define new debug_new

#endif

這樣ogre中會使用自己的new/delete,而不是呼叫vccrt中的_heap_alloc_debug

2. ogre中的物件沒有釋放

由於ogre中的很多物件並不是只要delete root就可以釋放的。最好所有的物件都不要自己new,而是通過ogre::root,ogre::scenemanager等建立,這些物件在root析構時會自己銷毀,但是對於從ogre類派生的類,由於ogre不存在create這些類的函式,所以只能在自己的**中new產生,並由自己負責析構了,比如movableobject派生的movabletext。當然ogre也會給你乙個將新物件加入其管理的介面,對於movabletext就必須再實現乙個movabletextfactory才行。總之要小心小心再小心。

最後抱怨一下ogre太大了,有乙個ogrelite就好了。現在這樣使用起來光鏈結都要半天,真是太誇張了,所以沒事最好不要修改ogre庫,呵呵。

論jquery與vuejs結合時的部分問題

最近在寫乙個移動端的單頁面,主要是放置到公司的平板系統上使用,需求如下 頂部結合左側欄切換導航的頁面,頁面的主體是呈現數量不定的,同時保證頁面整體不可以縮放,但是頁面內部的可以縮放,頂部的每乙個導航項對應左側的乙個導航欄,左側的乙個導航項對應乙個序列的。基於以上的需求,我選擇了以下的庫進行實現 1 ...

Struts2與spring結合時的高併發

原來見過乙個專案,用了struts2,可是由於action裡邊用了類變數,仍然資料亂跳。一般來說struts1,會出現資料亂跳,會認為正常,所以為了資料安全,struts1就不用類變數。可是struts2,本來就是執行緒安全,用了也沒事呀。究其根源,原來如下。1.struts2為每個執行緒提供乙個a...

IplImage與Mat的相互轉換 記憶體洩漏

原來是iplimage和mat之間轉化的時候,釋放記憶體問題。先引入淺拷貝和深拷貝問題。iplimage mat example 淺拷貝 iplimage pbinary cvloadimage c 0 mat img img cvarrtomat pbinary 深拷貝只需要再在mat裡建立乙個新...