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

C++ for loop causing memory leak?

我有一个用 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())];
}

如果我需要提供任何额外的代码,请告诉我。

我认为问题不在你的 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 似乎是罪魁祸首。它每次都会分配 return 一个指向新字符数组的指针,因此每次调用 myMap 都会生成相同字符串的新副本。

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