【发布时间】:2020-12-27 18:43:25
【问题描述】:
我用的是unordered_map,key是string,value是一个class IpsegInfo。 我读取了一个文件并使用文件数据来更新map中的值,map的大小总是一样的,但是内存中的map空间越来越大。
我的代码每 30 分钟从文件中更新一次地图,文件有 1000 万行,长度从未改变,只有数据会改变。所以我的地图长度也总是一千万。文件物理大小为 500MB,第一次加载后 unordered_map 内存大小为 4GB,但几个小时后,map 大小变为 50GB,并且不断变大,我想我应该是在某个地方发生了内存泄漏。
我的代码如下:
class IpsegInfo {
public:
string country;
string province;
string isp;
string asn;
IpsegInfo();
IpsegInfo(string country, string province, string isp, string asn);
~IpsegInfo();
};
//one thread is doing the map refresh. other threads read the map for quick access.
unordered_map<string, IpsegInfo> IpsegMap::map;
void refresh(){
while(1){
string line;
string delim = ",";
ifstream ipsegFile("/opt/test/ipseg.txt");
if(ipsegFile.is_open()){
while (getline(ipsegFile,line) ){
trim(line);
vector<string> ss = comUtil.split(line,delim);
IpsegInfo *info = new IpsegInfo(ss[1],ss[2],ss[3],ss[4]);
map[ss[0]] = *info;
}
}
ipsegFile.close();
sleep(60*30);
}
}
【问题讨论】:
-
这块内存在哪里被释放:
IpsegInfo *info = new ... -
@Jarvis
map不是关键字,实际上是 C++ 程序完全合法且合法的变量名。 -
但
map[ss[0]]是IpsegInfo类型的对象。它不是一个指针。这不是你分配的东西。在refresh函数中,info是一个指向你已经分配的东西的指针,但你从来没有delete它。解决方法是根本不使用new或临时的info变量,直接赋值给map[ss[0]]。 -
@Jack 你需要做的是找出哪个数据结构拥有你分配的内存,以及何时释放它。
-
@Someprogrammerdude 问题不在于不必要的局部变量
info,而在于分配的内存,它永远不会被释放。
标签: c++ unordered-map