<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Ogre中的內(nèi)存泄露

    剛開始使用Ogre時(shí)總是碰到內(nèi)存泄露,而且往往是一泄千里,等半分鐘才能打完日志,我想這和Ogre中的大量大對(duì)象很有關(guān)系。下面就來分析一下內(nèi)存泄露的產(chǎn)生原因。

    1. MFC中使用Ogre時(shí)發(fā)生的內(nèi)存泄露

    這個(gè)問題比較有意思,其實(shí)并沒有發(fā)生泄露,而是MFC自作主張的認(rèn)為發(fā)生了內(nèi)存泄露,實(shí)際上內(nèi)存并不是沒有釋放,而是在VC報(bào)內(nèi)存泄露之后釋放,先來看一看MFC報(bào)內(nèi)存泄露時(shí)的調(diào)用堆棧:

    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的析構(gòu)函數(shù):

    _AFX_DEBUG_STATE::~_AFX_DEBUG_STATE()
    {
    #ifndef _AFX_NO_DEBUG_CRT
    _CrtDumpMemoryLeaks();
    int nOldState = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
    _CrtSetDbgFlag(nOldState & ~_CRTDBG_LEAK_CHECK_DF);

    _CrtSetReportHook(pfnOldCrtReportHook);
    _CrtSetDumpClient(pfnOldCrtDumpClient);
    #endif // _AFX_NO_DEBUG_CRT
    }

    很顯然CrtDumpMemoryLeaks()是在mfc71d.dll卸載時(shí)被調(diào)用的,如果這個(gè)時(shí)候OgreMain_d.dll還沒有卸載,那么在Ogre中new的全局變量也就還沒有釋放,所以MFC會(huì)認(rèn)為產(chǎn)生了內(nèi)存泄露。如何處理這樣的問題呢。很簡(jiǎn)單,讓OgreMain_d.dll在mfc71d.dll之前析構(gòu),但是默認(rèn)的MFC程序似乎不是這樣干的(為什么呢?),這就要求對(duì)項(xiàng)目設(shè)置作一點(diǎn)調(diào)整,使得Mfc71d.dll在OgreMian之前被鏈接,這樣程序運(yùn)行時(shí)MFC71d就會(huì)早于Ogre加載,也就晚于Ogre卸載。具體設(shè)置如下:

    i) in the General tab, switch "Use MFC in 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,并且禁止調(diào)用MFC的DEBUG_NEW,這需要先

    #define OGRE_DEBUG_MEMORY_MANAGER 1

    然后刪除cpp中的以下行

    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif

    這樣Ogre中會(huì)使用自己的new/delete,而不是調(diào)用vccrt中的_heap_alloc_debug

     

    2. Ogre中的對(duì)象沒有釋放

    由于Ogre中的很多對(duì)象并不是只要delete Root就可以釋放的。最好所有的對(duì)象都不要自己new,而是通過Ogre::Root,Ogre::SceneManager等創(chuàng)建,這些對(duì)象在Root析構(gòu)時(shí)會(huì)自己銷毀,但是對(duì)于從Ogre類派生的類,由于Ogre不存在Create這些類的函數(shù),所以只能在自己的代碼中new產(chǎn)生,并由自己負(fù)責(zé)析構(gòu)了,比如MovableObject派生的MovableText。當(dāng)然Ogre也會(huì)給你一個(gè)將新對(duì)象加入其管理的接口,對(duì)于MovableText就必須再實(shí)現(xiàn)一個(gè)MovableTextFactory才行。總之要小心小心再小心。

    最后抱怨一下Ogre太大了,有一個(gè)OgreLite就好了。現(xiàn)在這樣使用起來光鏈接都要半天,真是太夸張了,所以沒事最好不要修改Ogre庫(kù),呵呵。

    posted on 2007-06-17 16:44 雁過無痕 閱讀(4741) 評(píng)論(5)  編輯  收藏

    評(píng)論

    # re: Ogre中的內(nèi)存泄露 2008-11-18 10:30 AlexQ

    很管用 謝謝  回復(fù)  更多評(píng)論   

    # re: Ogre中的內(nèi)存泄露 2009-01-02 01:33 geeeeeeee

    按第一種方法有如下錯(cuò)誤
    1>msvcrtd.lib(crtexew.obj) : error LNK2019: 無法解析的外部符號(hào) _WinMain@16,該符號(hào)在函數(shù) ___tmainCRTStartup 中被引用  回復(fù)  更多評(píng)論   

    # re: Ogre中的內(nèi)存泄露 2009-01-02 01:34 geeeeeeee

    可能是UNICODE問題不知如何解決  回復(fù)  更多評(píng)論   

    # re: Ogre中的內(nèi)存泄露 2009-07-26 16:22 yyyy

    謝謝,我也正好遇到此問題,按你的方法解決了  回復(fù)  更多評(píng)論   

    # re: Ogre中的內(nèi)存泄露 2012-08-31 15:08 Carefree

    你好,不知道現(xiàn)在樓主還研究OGRE么?
    我用ogre1.8也遇到了內(nèi)存泄露的問題,但按樓主的辦法沒有效果。  回復(fù)  更多評(píng)論   


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    <2007年6月>
    272829303112
    3456789
    10111213141516
    17181920212223
    24252627282930
    1234567

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(7)

    隨筆檔案

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 国产日韩精品无码区免费专区国产| 亚洲欧美熟妇综合久久久久| yellow免费网站| 国产特级淫片免费看| 亚洲精品无码专区在线播放| 亚洲国产精品99久久久久久| 亚洲视频日韩视频| 日本片免费观看一区二区| 777亚洲精品乱码久久久久久| 一级特黄aa毛片免费观看| 911精品国产亚洲日本美国韩国| 在线观看免费中文视频| 亚洲av午夜精品无码专区| 一个人看www在线高清免费看| 亚洲三级在线播放| 国产大片51精品免费观看| 色噜噜狠狠色综合免费视频| 亚洲Av无码乱码在线znlu| 亚洲第一视频在线观看免费| 亚洲日本va在线视频观看| 久久午夜夜伦鲁鲁片免费无码| 亚洲精品电影天堂网| 精品熟女少妇AV免费观看| 亚洲欧美中文日韩视频| 国产午夜亚洲不卡| 8888四色奇米在线观看免费看| 亚洲香蕉久久一区二区| vvvv99日韩精品亚洲| 国产情侣久久久久aⅴ免费| 亚洲欧洲日产国码二区首页| 永久免费毛片手机版在线看| 性生大片视频免费观看一级| 亚洲不卡av不卡一区二区| 性色av无码免费一区二区三区| 免费一级毛suv好看的国产网站| 亚洲精品国产精品乱码在线观看 | 久久久久国产成人精品亚洲午夜| 污视频在线免费观看| 日韩欧美亚洲国产精品字幕久久久 | 国产精品白浆在线观看免费| 亚洲免费视频网址|