C ++ for循环导致内存泄漏?

时间:2015-04-29 01:10:11

标签: c++ for-loop vector memory-leaks iterator

我有一个用C ++制作的游戏服务器,我最近注意到内存数量在不断增长。

我启动服务器,然后打开任务管理器(Windows 7)并查看内存。记忆是好的约20秒,但之后它会上升并且不会停止。

我缩小了正在执行此操作的代码:

for(std::vector<Door>::iterator door = myMap()->doors.begin(); door != myMap()->doors.end(); ++door){

}

我甚至不需要for循环中的任何代码,这是具有内存泄漏的代码。但是什么可能是内存泄漏?它是一个通过矢量对象的标准循环。

上面的代码在函数调用中运行,该调用通过单独线程上的while循环进行更新。如果我评论该代码,那么内存计数就没问题了。

编辑: myMap()定义:

Map* Player::myMap(){
    if(mapList == NULL){
        //cout << "mapList was NULL" << endl;
        return NULL;
    }

    //std::map<std::string, Map*> &myMapList = *mapList;

    //cout << "getting my map: " << (*mapList)["f1"]->blocks.at(0).x << endl;
    return (*mapList)[strdup(room.c_str())];
}

如果我需要提供任何其他代码,请告诉我。

2 个答案:

答案 0 :(得分:1)

现在您提供了myMap的定义,我可以告诉您,内存泄漏来自对strdup的调用。应该释放此函数返回的指针(通过调用free),因为它调用malloc

答案 1 :(得分:-1)

我认为问题不在你的for循环中,因为我可以运行以下内容而没有任何我可以检测到的泄漏:

#include <vector>

int main(){
    std::vector<int> my_vector;
    for(int i = 0; i < 100; i++)
        my_vector.push_back(i);
    for(;;)
        for(std::vector<int>::iterator it = my_vector.begin(); it != my_vector.end(); ++it){}
}

当然,根据您的编译器,您的里程可能会有所不同。但是我怀疑它是myMap调用,因为它创建了自己的函数作用域,它将无法访问,并且会泄漏任何剩余的内存。

编辑:根据你的myMap实现,看起来strdup是罪魁祸首。它将每次分配并返回一个指向新字符数组的指针,因此每次调用myMap都会生成相同字符串的新副本。