游戏对象工厂:修复内存泄漏

亲爱的,这将是艰难的:我已经创建了一个游戏对象工厂,生成我的愿望的对象。 但是,我得到了内存泄漏,我不能修复。

内存泄漏是通过返回新的Object(); 在代码示例的底部。

static BaseObject * CreateObjectFunc() { return new Object(); } 

如何以及在哪里删除指针? 我写了bool ReleaseClassType() 。 尽管工厂运行良好,但ReleaseClassType()不能修复内存泄漏。

 bool ReleaseClassTypes() { unsigned int nRecordCount = vFactories.size(); for (unsigned int nLoop = 0; nLoop < nRecordCount; nLoop++ ) { // if the object exists in the container and is valid, then render it if( vFactories[nLoop] != NULL) delete vFactories[nLoop](); } return true; } 

在看下面的代码之前,让我来帮助你,我的CGameObjectFactory创建指向创建特定对象types的函数的指针 。 指针存储在vFactoriesvector容器中。

我select了这种方式,因为我parsing一个对象映射文件。 我有对象typesID(整数值),我需要将它们转换成真实的对象。 因为我有超过100个不同的对象数据types,所以我希望避免连续遍历很长的Switch()语句。

因此,要创建一个对象,我通过CGameObjectFactory :: create()调用vFactoriesnEnumObjectTypeID来调用生成所需对象的存储函数。

vFactories中相应函数的位置与nObjectTypeID相同,所以我可以使用索引来访问函数。

所以问题仍然存在, 如何进行垃圾回收,避免报告的内存泄漏?

 #ifndef GAMEOBJECTFACTORY_H_UNIPIXELS #define GAMEOBJECTFACTORY_H_UNIPIXELS //#include "MemoryManager.h" #include <vector> template <typename BaseObject> class CGameObjectFactory { public: // cleanup and release registered object data types bool ReleaseClassTypes() { unsigned int nRecordCount = vFactories.size(); for (unsigned int nLoop = 0; nLoop < nRecordCount; nLoop++ ) { // if the object exists in the container and is valid, then render it if( vFactories[nLoop] != NULL) delete vFactories[nLoop](); } return true; } // register new object data type template <typename Object> bool RegisterClassType(unsigned int nObjectIDParam ) { if(vFactories.size() < nObjectIDParam) vFactories.resize(nObjectIDParam); vFactories[nObjectIDParam] = &CreateObjectFunc<Object>; return true; } // create new object by calling the pointer to the appropriate type function BaseObject* create(unsigned int nObjectIDParam) const { return vFactories[nObjectIDParam](); } // resize the vector array containing pointers to function calls bool resize(unsigned int nSizeParam) { vFactories.resize(nSizeParam); return true; } private: //DECLARE_HEAP; template <typename Object> static BaseObject * CreateObjectFunc() { return new Object(); } typedef BaseObject*(*factory)(); std::vector<factory> vFactories; }; //DEFINE_HEAP_T(CGameObjectFactory, "Game Object Factory"); #endif // GAMEOBJECTFACTORY_H_UNIPIXELS 

你不能从Factory类中清理。 之后的任何代码都是由create()来释放内存。 你所做的“清理”只是分配,然后销毁每种types的新对象。