C++ C++;:使用指针存储/访问大型对象以避免内存不足
我有一个C++应用程序,需要同时加载几个大的无序的映射到内存中,结果在运行时(在一些大的无序的映射已经加载之后),我的栈空间C++ C++;:使用指针存储/访问大型对象以避免内存不足,c++,pointers,memory-management,stack-overflow,osx-yosemite,C++,Pointers,Memory Management,Stack Overflow,Osx Yosemite,我有一个C++应用程序,需要同时加载几个大的无序的映射到内存中,结果在运行时(在一些大的无序的映射已经加载之后),我的栈空间堆空间:> 似乎一个潜在的解决方案是将堆中的一些大型数据结构存储为指针,从而避免内存耗尽这个逻辑正确吗? 如果是,下面是我在尝试实施更改时遇到的下一个问题: 当我声明要保存在堆中的无序映射时,我使用指针(例如,unordered\u map*allMeds=mapAllMeds(ALL\u MEDS\u文件); mapAllMeds函数创建了一个大的无序映射,我假设它将
- 当我声明要保存在堆中的无序映射时,我使用指针(例如,
unordered\u map
*allMeds=mapAllMeds(ALL\u MEDS\u文件);
函数创建了一个大的无序映射,我假设它将它返回到名为mapAllMeds
的指针。还没有问题*allMeds
- 当我尝试访问
(或我定义为指针的任何其他无序映射)中的元素时,我得到了类型为“无序映射”的错误*allMeds
无可行重载运算符[]
vector-medsForPatient=allMeds[apient.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;
}
unordered_-map makeMedSynonyms(){
无序地图;
字符串分隔符=“|”;
ifstream ifs(MED_同义词_文件);
弦线;
while(std::getline(ifs,line)){
载体medSynVec;
字符串::size\u type lastPos=line.find\u first\u not\u of(分隔符,0);
字符串::size\u type pos=line.find\u first\u of(分隔符,lastPos);
while(string::npos!=pos | | string::npos!=lastPos){
medSynVec.推回(行substr(lastPos,pos-lastPos));
lastPos=行。首先查找(分隔符,pos)中的\u而不是\u;
pos=行。查找(分隔符,lastPos)中的第一个;
}
medSynVec[0]=medSynVec[1];
}
返回medap;
}
该功能的一个问题是:
medSynonymsMap[medSynVec[0]] = medSynVec[1];
您没有检查
medSynVec
是否至少有2个条目。如果条目数<2,则上面的行调用未定义的行为。堆内存不足,而不是堆栈内存不足。无法使用[]因为您得到的是指向无序_映射的指针,而不是无序_映射类型的对象。您需要首先取消对该指针的引用:vector&myVec=(*allMeds)[myString];@JDRomano2 size=8949833580846596096你知道那是多少内存吗?那是8139826terrabytes,你的程序肯定出了问题。除非你为美国宇航局或NBA@JDRomano2我同意斯拉瓦的观点。考虑到medSynymonsmap[medSynVec[0]]=medSynVec[1];
您没有检查medSynVec
中是否至少有两个条目。如果条目数<2,该行将调用未定义的行为。
medSynonymsMap[medSynVec[0]] = medSynVec[1];