2012-02-10 65 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