std :: int和struct的内存耗尽内存(std :: Bad_alloc)c ++

时间:2016-05-22 21:25:58

标签: c++ memory stack heap

我的程序中有以下内容

class memModel
{
    struct Addrlist
    {
        vector<string> data;
        vector<int> timestamp;
        vector<string> client;
    }

    map<int, Addrlist> AddrMap ; //store based address and list of all accesses
}

在main()中,我从一些文件中读取并将数百万条记录存储到此结构中

int main()
{
    memModel newObj ;
    ifstream file1("dataStream");
    ifstream file2("timeStampSteam");
    ifstream file3("clientStream");
    ifstream file4("addrStream") ; 
    string dataSTR,clientSTR;
    int time = 0 ; 
    int addr;
    for(int i=0; i<10000000/*10mil*/ ; i++)
    {
        getline(file1,dataSTR);
        getline(file3,clientSTR);
        file2 >> time ; 
        file4 >> hex >> addr ; 

        newObj.AddrMap[addr].data.push_back(dataSTR) ; 
        newObj.AddrMap[addr].time.push_back( time) ;
        newObj.AddrMap[addr].client.push_back(clientSTR) ;
    }      

  }    

所以问题是我的内存不足并得到std :: Bad_alloc异常。此代码适用于较小的数据大小。

我试图了解结构和地图的存储位置。一切都在堆栈上吗? 向量是动态分配的。那些人会去堆吗?

这是我第一次使用大型数据集,所以我想更好地理解这些概念。如何更改此项以确保我正在使用堆并且不会耗尽内存。

1 个答案:

答案 0 :(得分:4)

    newObj.AddrMap[addr].data[i] = dataSTR ; 
    newObj.AddrMap[addr].time[i] = time ;
    newObj.AddrMap[addr].client[i] = clientSTR ;

这里将三项数据存储到三个向量中。

不幸的是,所有这些向量都是空的,并且它们不包含任何元素。这会导致未定义的行为。

您必须提前使用push_back()resize()这些向量,因此它们的大小足以存储您在此处放置到向量中的项目。

std::vector operator[]不会自动创建或调整数组大小。它只访问数组中的现有元素。