2

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) );

解放されていません。(真実は、私は配列を空にしないということですが、どうすれば、その関数の外部にアクセスできません!)。

ここにキャッチがあります:マーマレードは、この関数の最初の呼び出しで予約されたメモリに対してのみ文句を言います! この関数は、いくつかの異なるテンプレート パラメータを使用して数回呼び出されますが、最初の呼び出しで予約されたメモリに対してのみ、常に問題が発生します。これは、この関数へのさまざまな呼び出しの順序を混同した場合でも当てはまります。最初の呼び出しが自動的に解放された後のすべての呼び出しのために予約されたメモリ - 私はこれをチェックアウトしました。

それで、今誰のせいですか?

4

1 に答える 1

1

「マーマレード」が何であるかはわかりません(そして、この単語をすばやく検索すると、無関係な参照が多数見つかると予想されます)が、コードには に関するリソースリークはありませんstatic FPIDArray siblingFunctions。このオブジェクトは、関数が初めて構築されるときに作成されますと呼ばれます。終了後、ある時点で破棄されmain()ます。静的リンケージを持つオブジェクトの破棄の順序は、オブジェクトが構築される順序の逆であることを思い出すようですが、これが関数のローカル静的を拡張するかどうかはわかりません。

于 2012-02-10T20:32:37.567 に答える