私は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;
};
注たびにテンプレートクラスがが静的ローカル配列が作成され、1回目のために呼び出されdiscoverIdこと:私は私のコードやマーマレードで「バグ」があるかどうかを知る必要があります。
siblingFunctions.push_back(FP_ID(funcPtr, newId));
解放されていない:プログラムの終了時に
、マーマレードのメモリマネージャは、このラインで予約メモリがあることを訴えます。 (真実は私が配列を空にしないことです、しかし、どのように私は、私はその機能の外にアクセスする必要はありません!)。ここで
はキャッチです:マーマレードは非常に最初の呼び出し、この関数ので 予約専用メモリのために不平を言います!この関数は複数回呼び出され、いくつかの異なるテンプレートパラメータで呼び出されますが、最初の呼び出しで予約されたメモリに対してのみ不平が常に発生します。これは、この関数のさまざまな呼び出しの順序をミックスした場合でも同じです。最初のコールが自動的に解放された後のすべてのコールに予約されているメモリ - これをチェックしました。
今、誰が責任を負うのですか?
std :: vectorは、複数の要素のスペースをすぐに割り当てることができます。最初のプッシュが後続のすべてのプッシュにスペースを割り当てるヒットにならないことは確かです。 –
@JoachimIsaksson私はstd :: vectorを使用します。非常に頻繁に、私は以前にこの問題を抱えていませんでした。それは "テンプレート+静的ローカル"の組み合わせと関係している必要があります –