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
.
我有一个用 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
.