大家可能會遇到一些ogre中的記憶體分配的方面問題,我對這個總結了一下記憶體分配的方面資料。
ogre在1.7版本後,統一了記憶體分配策略,提供了記憶體是否洩漏的跟蹤和記憶體池等比較方便開發的一些策略,目前提供了四種記憶體分配
ogre_memory_allocator 方式:
#define ogre_memory_allocator_std 1
#define ogre_memory_allocator_ned 2
#define ogre_memory_allocator_user 3
#define ogre_memory_allocator_nedpooling 4
大家從字面意思上應該能知道這四種記憶體分配方是的1、標準記憶體分配(主要是使用系統提供的預設記憶體分配方法);2、ned方式記憶體分配;3、使用者自定義的記憶體分配方法(主要是針對stl容器);4、ned記憶體池分配方法。
nedpooling的實現在ogre源**中可以找到,如果你們感興趣可以去研究一下記憶體分配方法。
不管是用哪種分配模式,如果開啟了ogre_memory_tracker_debug_mode /ogre_memory_tracker_release_mode ,那麼都可以對記憶體洩漏進行跟蹤,系統有無記憶體洩漏,洩漏了多少記憶體,如果我們在debug模式下編譯執行,有些可以跟蹤到哪行**會發生記憶體洩漏。
下面我給出乙個示例,具體說明一下各種情況下的記憶體分配怎麼用:
1、stl標準模板庫中的容器,不要直接使用std::map,std::vector,std::list,std::queue等容器;改用 ogre::map::type,ogre::vector::type,ogre::list::type等容器。使用後面的容器將會採用編譯時指定的記憶體分配方式做記憶體分配,主要的優點是可以對容器中的記憶體是否洩漏進行跟蹤。
eg:ogre::vector::type meshlist;
最好不要使用std::vector,因為直接使用std::vector不具有記憶體跟蹤功能。
根據ogre的程式設計風格,建議按照如下方式宣告變數:
typedef ogre::vector::type meshlist;
typedef meshlist::iterator meshlistiterator;
meshlist mmeshlist;
2、如果你的物件需要記憶體跟蹤和採用ogre的記憶體分配方式,那麼你的類需要繼承自ogre::geometryallocatedobject ,如果你的物件是頻繁的記憶體申請釋放建議你最好繼承這個類。
1.7.2以後繼承於allocatedobject
eg:class myobject: public ogre::geometryallocatedobject
myobject* myobject=ogre_new myobject();
ogre_delete myobject;
myobject=0;
當然直接使用new,delete也可以,因為geometryallocatedobject這個基類過載了new,delete操作符,使用ogre_new,ogre_delete只是為了方便開發人員指導這個類是採用了記憶體池的方式。
3、如果你的物件沒有繼承自ogre::geometryallocatedobject ,但是你又像使用ogre提供的記憶體池和記憶體洩漏跟蹤功能,那麼你可以採用如下的方式:
eg:class myobject
myobject* myobject=ogre_new_t(myobject,ogre::memcategory_general)();
ogre_delete_t(myobject,ogre::memcategory_general);
myobject=0;
4、對於一些簡單型別的變數,如果要使用ogre提供的記憶體池和記憶體跟蹤,分配記憶體塊通常用的是
eg:size_t count=1000;
char* chunk=ogre_alloc_t(char,count,ogre::memcategory_general);
ogre_free(chunk,ogre::memcategory_general);
chunk=0;
以上就是我們常用的ogre記憶體分配方式,掌握他們,就基本上能解決我們
boost pool記憶體池使用
1 boost pool只能作為普通資料型別的記憶體池,如int double等,因為他只分配記憶體,不呼叫建構函式。2 如果記憶體分配失敗,不拋異常,我們應該判斷返回的指標是不是nullptr,防止空指標錯誤。3 我們一般不應該手工呼叫free 等釋放記憶體的函式,應該交給記憶體池自動進行管理。如...
記憶體池,程序池,和執行緒池的比較分析
由於伺服器的硬體資源 充裕 那麼提高伺服器效能的乙個很直接的方法就是以空間換時間,即 浪費 伺服器的硬體資源,以換取其執行效率。這就是池的概念。池是一組資源的集合,這組資源在伺服器啟動之初就完全被建立並初始化,這稱為靜態資源分配。當伺服器進入正式執行階段,即開始處理客戶請求的時候,如果它需要相關的資...
C 使用記憶體池,Stream池防止記憶體碎片化
為什麼要引入記憶體池?引入記憶體池的好處是什麼?引入記憶體池能解決哪些問題?什麼情況下使用記憶體池效果更加明顯?相信大家都懂,那我們就不說了,直接來看看怎麼使用吧。我想了想,覺得還是要先解答一下上面的問題,不然我有些過意不去 qiang po zheng 為什麼引入記憶體池,好處是什麼?能夠重複利用...