C++;对于导致内存泄漏的循环? 我有一个C++游戏服务器,最近我注意到内存计数在不断增长。
我启动服务器,然后打开任务管理器(Windows7)并查看它的内存。内存在大约20秒钟内是正常的,但在那之后它会上升并且不会停止 我已经缩小了执行此操作的代码范围: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
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实现。不过,感谢您的输入。