为什么我的unordered_map越来越大
why is my unordered_map getting bigger and bigger
我用的是unordered_map,key是string,value是一个classIpsegInfo。
我读取了一个文件并使用文件数据来更新地图中的值,地图大小始终相同但是内存中的地图space越来越大。
我的代码每 30 分钟从文件中更新一次地图,文件有 1000 万行,长度从未改变,只有数据会改变。所以我的地图长度也总是与 1000 万相同。文件物理大小是500MB,第一次加载后unordered_map内存大小是4GB,但是几个小时后地图大小变成了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 IpsegInfo(ss[1],ss[2],ss[3],ss[4]);
map[ss[0]] = *info;
在这里您使用 new 创建一个 IpsegInfo
。这意味着您还应该使用 delete
删除它。
相反,您只需覆盖它,就会造成内存泄漏。使用 RAII 让您的数据自动管理:
IpsegInfo info = IpsegInfo(ss[1],ss[2],ss[3],ss[4]); // no pointers!
map[ss[0]] = info;
我用的是unordered_map,key是string,value是一个classIpsegInfo。 我读取了一个文件并使用文件数据来更新地图中的值,地图大小始终相同但是内存中的地图space越来越大。
我的代码每 30 分钟从文件中更新一次地图,文件有 1000 万行,长度从未改变,只有数据会改变。所以我的地图长度也总是与 1000 万相同。文件物理大小是500MB,第一次加载后unordered_map内存大小是4GB,但是几个小时后地图大小变成了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 IpsegInfo(ss[1],ss[2],ss[3],ss[4]);
map[ss[0]] = *info;
在这里您使用 new 创建一个 IpsegInfo
。这意味着您还应该使用 delete
删除它。
相反,您只需覆盖它,就会造成内存泄漏。使用 RAII 让您的数据自动管理:
IpsegInfo info = IpsegInfo(ss[1],ss[2],ss[3],ss[4]); // no pointers!
map[ss[0]] = info;