2012-02-10 64 views
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被調用的第一時間,靜態局部陣列創建。

在程序退出,果醬內存管理器抱怨說,記憶在這一行保留:

siblingFunctions.push_back(FP_ID(funcPtr, newId)); 

沒有被釋放。 (事實是,我不清空數組,但我怎麼可能,我沒有訪問它的功能以外!)。

這裏是漁獲:醬抱怨只對內存中保留遇到第一次調用這個函數的!該函數被多次調用並且具有多個不同的模板參數,但抱怨總是隻發生在第一次調用時保留的內存。即使我混淆了對此函數的各種調用順序,情況也是如此。在第一個電話被自動釋放之後爲每個電話保留的存儲空間 - 我檢查了這一點。

那麼,現在是誰的責任呢?

+1

std :: vector 可能會立即爲多個元素分配空間,您確定這不僅僅是第一次推動爲所有後續推送分配空間的「命中」情況? – 2012-02-10 20:18:39

+0

@JoachimIsaksson我經常使用std :: vector ,我之前沒有遇到過這個問題。它必須與「模板+靜態本地」組合 – 2012-02-10 20:28:28

回答

1

我不知道「Marmalade」是什麼(並且快速搜索此詞預計會發現很多不相關的引用),但是您的代碼沒有關於static FPIDArray siblingFunctions的資源泄漏:此對象已構建函數第一次被調用。它在main()退出後的某個點被銷燬。我似乎記得,靜態鏈接對象的破壞順序與構造對象的順序相反,但我不確定這是否擴展了函數局部靜態。

+0

謝謝,我認爲是這樣。那麼,這裏是Marmalade SDK鏈接:http://www.madewithmarmalade.com/ – 2012-02-10 20:37:00

+1

我相信你是正確的順序,3.6.3/1適用於具有靜態存儲持續時間的初始化對象,並說:「...如果完成構造函數或具有線程存儲持續時間的對象的動態初始化在另一個之前被排序,第二個析構函數的完成在第一個析構函數啓動之前被排序。 – 2012-02-10 21:11:25