我在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被調用的第一時間,靜態局部陣列創建。
在程序退出,果醬內存管理器抱怨說,記憶在這一行保留:
siblingFunctions.push_back(FP_ID(funcPtr, newId));
沒有被釋放。 (事實是,我不清空數組,但我怎麼可能,我沒有訪問它的功能以外!)。
這裏是漁獲:醬抱怨只對內存中保留遇到第一次調用這個函數的!該函數被多次調用並且具有多個不同的模板參數,但抱怨總是隻發生在第一次調用時保留的內存。即使我混淆了對此函數的各種調用順序,情況也是如此。在第一個電話被自動釋放之後爲每個電話保留的存儲空間 - 我檢查了這一點。
那麼,現在是誰的責任呢?
std :: vector可能會立即爲多個元素分配空間,您確定這不僅僅是第一次推動爲所有後續推送分配空間的「命中」情況? –
2012-02-10 20:18:39
@JoachimIsaksson我經常使用std :: vector,我之前沒有遇到過這個問題。它必須與「模板+靜態本地」組合 –
2012-02-10 20:28:28