C ++:使用指针存储/访问大对象以避免内存不足

时间:2015-02-18 17:27:08

标签: c++ pointers memory-management stack-overflow osx-yosemite

我有一个C ++应用程序,需要同时将几个非常大的unordered_maps加载到内存中,因此我在运行时耗尽了堆栈空间 堆空间在一些大的unordered_maps已经加载之后):

granger(34190, 0x7fff73062300) malloc: *** mach_vm_map(size=8949833580846596096) failed (error code=3)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
libc++abi.dylib: terminating with uncaught exception of type std::bad_alloc: std::bad_alloc
[1]    34488 abort      ./granger

似乎潜在的解决方案是将堆 中的一些大型数据结构保存为指针,这样我就可以避免内存不足。 这个逻辑是否正确?

如果是,这是我在尝试实施变更时遇到的下一个问题:

  • 当我声明要保留在堆中的unordered_maps时,我使用指针(例如; unordered_map< string,vector<string> > *allMeds = mapAllMeds(ALL_MEDS_FILE);
  • mapAllMeds函数创建大的unordered_map,我假设它将它返回给名为*allMeds的指针。还没问题
  • 当我尝试访问*allMeds中的元素(或我定义为指针的任何其他unordered_maps)时,我收到错误no viable overloaded operator[] for type 'unordered_map<string, vector<string> > *

编辑:第3个项目符号点的示例代码:vector<string> medsForPatient = allMeds[aPatient.getDeid()];返回上述错误。

当我尝试访问由指针定义的无序映射中的键/值对时,这是否意味着我无法使用普通[]运算符?如果没有,可以使用哪种解决方法?

编辑2:好的,所以这些评论告诉我,我的堆空间不足,而不是堆栈空间,但这根本不能解决我的问题:我可以采用什么方法将所有数据结构同时存入内存而不会耗尽可寻址的内存空间?

编辑3:以下是应用程序在运行时崩溃的功能:

unordered_map<string,string> makeMedSynonyms() {
    unordered_map<string,string> medSynonymsMap;
    string delimiters = "|";
    ifstream ifs(MED_SYNONYMS_FILE);
    string line;
    while(std::getline(ifs, line)) {
        vector<string> medSynVec;
        string::size_type lastPos = line.find_first_not_of(delimiters, 0);
        string::size_type pos = line.find_first_of(delimiters, lastPos);
        while(string::npos != pos || string::npos != lastPos) {
            medSynVec.push_back(line.substr(lastPos, pos - lastPos));
            lastPos = line.find_first_not_of(delimiters, pos);
            pos = line.find_first_of(delimiters, lastPos);
        }
        medSynonymsMap[medSynVec[0]] = medSynVec[1];
    }
    return medSynonymsMap;
}

1 个答案:

答案 0 :(得分:2)

该功能的一个问题是:

  medSynonymsMap[medSynVec[0]] = medSynVec[1];

您没有检查medSynVec是否至少有2个条目。如果条目数是&lt; 2,然后上面的行调用未定义的行为。