我有一个用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())];
}
如果我需要提供任何其他代码,请告诉我。
答案 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都会生成相同字符串的新副本。