親愛なる皆さん、これは大変なことになりそうです: 私は希望するオブジェクトを生成するゲーム オブジェクト ファクトリを作成しました。ただし、修正できないメモリリークが発生します。
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 ベクター コンテナー内に格納されます。
オブジェクト マップ ファイルを解析するため、この方法を選択しました。オブジェクト タイプ ID (整数値) を実際のオブジェクトに変換する必要があります。100 を超えるさまざまなオブジェクト データ型があるため、非常に長い Switch() ステートメントを継続的にトラバースすることは避けたいと考えました。
したがって、オブジェクトを作成するには、CGameObjectFactory::create() 経由で vFactories '['nEnumObjectTypeID']'()を呼び出して、目的のオブジェクトを生成するストアド関数を呼び出します。
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