Marmalade SDK で次のコードを実行しています。コードまたはマーマレードに「バグ」があるかどうかを知る必要があります。
template <class Return = void, class Param = void*>
class IFunction {
private:
static unsigned int counterId;
protected:
unsigned int id;
public:
//
static unsigned int getNewId() { return counterId++; }
template <class FunctionPointer>
static unsigned int discoverId(FunctionPointer funcPtr) {
typedef std::pair<FunctionPointer, unsigned int> FP_ID;
typedef std::vector<FP_ID> FPIDArray;
static FPIDArray siblingFunctions; // <- NOTE THIS
typename FPIDArray::iterator it = siblingFunctions.begin();
while (it != siblingFunctions.end()) {
if (funcPtr == it->first) return it->second; /// found
++it;
}
/// not found
unsigned int newId = getNewId();
siblingFunctions.push_back( FP_ID(funcPtr, newId) ); // <- NOTE THIS
return newId;
}
//
virtual ~IFunction() {}
bool operator<(const IFunction* _other) const {
if (this->id < _other->id) return true;
return false;
}
virtual Return call(Param) = 0;
};
テンプレート クラスのdiscoverIdが最初に呼び出されるたびに、静的なローカル配列が作成されることに注意してください。
プログラムの終了時に、Marmalade メモリ マネージャーは、この行でメモリが予約されていると不平を言います。
siblingFunctions.push_back( FP_ID(funcPtr, newId) );
解放されていません。(真実は、私は配列を空にしないということですが、どうすれば、その関数の外部にアクセスできません!)。
ここにキャッチがあります:マーマレードは、この関数の最初の呼び出しで予約されたメモリに対してのみ文句を言います! この関数は、いくつかの異なるテンプレート パラメータを使用して数回呼び出されますが、最初の呼び出しで予約されたメモリに対してのみ、常に問題が発生します。これは、この関数へのさまざまな呼び出しの順序を混同した場合でも当てはまります。最初の呼び出しが自動的に解放された後のすべての呼び出しのために予約されたメモリ - 私はこれをチェックアウトしました。
それで、今誰のせいですか?