为什么我的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;