Очень странная утечка памяти - PullRequest
2 голосов
/ 11 февраля 2012

Я использую следующий фрагмент кода в Marmalade SDK.Мне нужно знать, есть ли «ошибка» в моем коде или в Marmalade:

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

не была освобождена.(Правда в том, что я не очищаю массив, , но как я могу , у меня нет доступа к нему вне этой функции!).

Вотcatch: Мармелад жалуется только на зарезервированную память при самом первом вызове этой функции!Эта функция вызывается несколько раз и с несколькими различными параметрами шаблона, но жалоба всегда возникает только для памяти, зарезервированной при первом вызове.Это имеет место, даже если я перепутаю порядок различных вызовов этой функции.Память зарезервирована для каждого вызова после того, как первый автоматически освобождается - я проверил это.

Итак, кто сейчас виноват?

1 Ответ

1 голос
/ 11 февраля 2012

Я не знаю, что такое "мармелад" (и быстрый поиск этого слова, как ожидается, обнаружил множество неуместных ссылок), но в вашем коде нет утечки ресурсов по отношению к static FPIDArray siblingFunctions: этот объектпостроен первый раз, когда функция вызывается.Он уничтожается в какой-то момент после выхода main().Кажется, я вспоминаю, что порядок уничтожения объектов со статической связью является обратным порядку, в котором строятся объекты, но я не уверен, расширяет ли это функцию локальной статики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...