我已经定义了一个自定义istream运算符>>从文本文件读取对象(包)的容器(库)
istream& operator>>(istream& ist, library& lib) //js read packages into library
{
char c;
while (ist.get(c)){ //js read in package
string name;
while(c != ',' || c!= ';'){ //js read file name
name += c;
ist.get(c);
}
vector<string> tagz;
while(c != ';'){ //js read in tags
ist.get(c);
string temptag;
while(c != ','){
temptag += c;
ist.get(c);
if(c==',') tagz.push_back(temptag); //js add tag to tagz vector
}
package temp(name, tagz); //js define new package
lib.add(temp); //js add new package to list
}
}
return ist;
}
但是,当我在main函数中使用运算符时,我收到错误
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
我知道这是一个内存分配问题,但我无法弄清楚bug的位置。任何帮助或意见表示赞赏!
答案 0 :(得分:2)
我认为这里的问题可能是这种形式的循环:
while(c != ';'){ //js read in tags
ist.get(c);
...
}
如果ist
在读取;
之前遇到错误(例如,读取文件末尾或连接中断),则会进入无限循环因为ist.get(c)
会使c
保持不变。由于您的代码会将字符追加到字符串中,因此此无限循环将尝试创建一个无限长的字符串,当系统内存不足时,该字符串将失败。
要解决此问题,您可能应该对此代码添加一些错误检查,以便在流提取期间遇到错误时,您的函数将退出而不是无限循环。
编辑:正如@ uk4321指出的那样,这里还有一个无限循环:
while(c != ',' || c!= ';') {
...
}
这句话总是如此。每个字符只有一个值,因此每个字符的比较与,
和;
中的至少一个不同。要解决此问题,请尝试将其重写为
while(c != ',' && c!= ';') {
...
}
希望这有帮助!
答案 1 :(得分:0)
请在此处查看此代码:
string temptag;
while(c != ','){
temptag += c;
ist.get(c);
if(c==',') tagz.push_back(temptag); //js add tag to tagz vector
}
它会创建string
,将其分配给temptag
,然后然后循环。 temptag
变量永远不会被重新分配,因此每次都会向tagz
添加相同的变量。这意味着当tagz
被破坏时,它会尝试多次破坏temptag
并抛出异常。