C++;对于导致内存泄漏的循环? 我有一个C++游戏服务器,最近我注意到内存计数在不断增长。

C++;对于导致内存泄漏的循环? 我有一个C++游戏服务器,最近我注意到内存计数在不断增长。,c++,for-loop,vector,memory-leaks,iterator,C++,For Loop,Vector,Memory Leaks,Iterator,我启动服务器,然后打开任务管理器(Windows7)并查看它的内存。内存在大约20秒钟内是正常的,但在那之后它会上升并且不会停止 我已经缩小了执行此操作的代码范围: for(std::vector<Door>::iterator door = myMap()->doors.begin(); door != myMap()->doors.end(); ++door){ } for(std::vector::iterator door=myMap()->doors.beg

我启动服务器,然后打开任务管理器(Windows7)并查看它的内存。内存在大约20秒钟内是正常的,但在那之后它会上升并且不会停止

我已经缩小了执行此操作的代码范围:

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

}
for(std::vector::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())];
}
Map*Player::myMap(){
if(mapList==NULL){

//cout我认为问题不在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){}
}
#包括
int main(){
std::vector my_vector;
对于(int i=0;i<100;i++)
我的向量。推回(i);
对于(;;)
对于(std::vector::iterator it=my_vector.begin();it!=my_vector.end();++it){
}
当然,根据编译器的不同,您的里程可能会有所不同。但我怀疑这是myMap调用,因为这会创建自己的函数范围,而该范围将变得不可访问,并会泄漏任何剩余内存



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

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

什么是
myMap()
在做什么?在
myMap()
中做什么?显示
myMap
的定义以及它调用的任何其他代码。我打赌
myMap()
函数内部有一个
新的
:除了推测您的
myMap
函数正在分配内存而没有释放内存之外,还有其他潜在问题。如果
myMap()
返回一个新实例,由于使用了不同的
door
向量,您正在破坏迭代。为什么甚至需要调用
strdup
呢?据我所知,不需要复制字符串。如果不看到
door
myMap()的实现?问题很可能是for循环的一部分。<代码>我可以运行下面的程序,而没有任何我可以检测到的漏洞:考虑如下:<代码>实例*MyApp(){返回新实例;}
现在您看到循环如何导致内存泄漏了吗?我的观点是,问题不在于他的for循环代码,而在于他的myMap实现。不过,感谢您的输入。