Дорогие все, это будет сложно: я создал фабрику игровых объектов, которая генерирует объекты моего желания.Тем не менее, я получаю утечки памяти, которые я не могу исправить.
Утечки памяти генерируются return new 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 создает указатели на функции создание определенного типа объекта.Указатели хранятся в векторном контейнере vFactories.
Я выбрал этот способ, потому что я анализирую файл объектной карты.У меня есть идентификаторы типов объектов (целочисленные значения), которые мне нужны, чтобы перевести их в реальные объекты.Поскольку у меня более 100 различных типов данных объекта, я хотел бы избежать непрерывного обхода очень длинного оператора Switch ().
Поэтому, чтобы создать объект, я вызываю vFactories '[' nEnumObjectTypeID ']' () через CGameObjectFactory :: create () для вызова хранимой функции, которая генерирует нужный объект.
Положение соответствующей функции в 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