Я запускаю следующий фрагмент кода под SDK Marmalade. Мне нужно знать, если есть «ошибка» в моем коде или в 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 вызывается для 1-й раз, статический локальный массив создается.
При выходе из программы, диспетчер памяти Мармелад жалуется, что память, зарезервированная на этой линии:
siblingFunctions.push_back(FP_ID(funcPtr, newId));
не был освобожден. (Правда в том, что я не освобождаю массив, , но как я мог, у меня нет доступа к нему вне этой функции!).
Вот улов: Мармелад жалуется только на память зарезервирован при первом вызове этой функции! Эта функция вызывается несколько раз и с несколькими различными параметрами шаблона, но жалоба всегда происходит только для памяти, зарезервированной при первом вызове. Это так, даже если я смешиваю порядок различных вызовов этой функции. Память, зарезервированная для каждого вызова после 1-го, автоматически освобождается - я проверил это.
Итак, кто виноват сейчас?
std :: vector может выделить пространство для более чем одного элемента сразу, вы уверены, что это не тот случай, когда первый толчок занимает «хит» выделения пространства для всех ваших последующих нажатий? –
@JoachimIsaksson Я использую std :: vector очень часто, у меня не было этой проблемы раньше. Это должно быть связано с комбинацией «шаблон + статический локальный» –