c++ - 非常奇怪的内存泄漏

标签 c++ memory-leaks static marmalade

我在 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 时,都会创建一个静态本地数组

在程序退出时,Marmalade 内存管理器提示在这一行保留的内存:

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

还没有被释放。 (事实是我没有清空数组,但我怎么能,我无法在该函数之外访问它!)。

问题是:Marmalade 仅在第一次调用此函数时提示保留的内存!这个函数被多次调用并使用了几个不同的模板参数,但提示总是只发生在第一次调用时保留的内存中。即使我混淆了对该函数的各种调用的顺序,情况也是如此。在第一个调用自动释放后为每个调用保留的内存 - 我已经检查过了。

那么,现在该怪谁了?

最佳答案

我不知道“Marmalade”是什么(并且快速搜索这个词预计会发现很多不相关的引用)但是你的代码没有关于 static FPIDArray siblingFunctions< 的资源泄漏:这个对象是在第一次调用函数时构造的。它在 main() 退出后的某个时刻被销毁。我似乎记得具有静态链接的对象的破坏顺序与构造对象的顺序相反,但我不确定这是否扩展了函数局部静态。

关于c++ - 非常奇怪的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9234239/

相关文章:

用于用户定义数据类型的 c++ unordered_map

ios - 在 iOS 上使用带有 ARC 的 block 时,确保对象存在并且不会泄漏的正确方法是什么?

c# - 由于继承是不可能的,有没有办法在静态类中重用代码?

java - 无法调用在 Java 6 中作为上界 ("extends"泛型接收的类的静态方法?

c++ - Qt应用程序中 undefined reference 错误

c++ - 使用 QFileSystemModel 隐藏过滤后的文件,setNameFilterDisables(false) 隐藏所有内容

vb6 - 我什么时候必须在 VB6 中将变量设置为 "Nothing"?

objective-c - UIToolbar内存泄漏

抽象类中的 Java 静态属性

c++ - %s 不能使用字符串