gpt4 book ai didi

c++ - 为什么我的重载 >> 运算符会抛出 bad_alloc?

转载 作者:行者123 更新时间:2023-11-28 03:02:52 24 4
gpt4 key购买 nike

我已经定义了一个自定义的 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;
}

但是,当我在主函数中使用运算符时,出现错误

terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc

我知道这是一个内存分配问题,但我不知道错误在哪里。感谢您提供任何帮助或意见!

最佳答案

我认为这里的问题可能是这种形式的循环:

 while(c != ';'){    //js read in tags
ist.get(c);
...
}

如果 ist 在读取 ; 之前遇到错误(例如,读取到文件末尾或连接中断),则此将进入无限循环,因为 ist.get(c) 将保持 c 不变。由于您的代码不断将字符附加到字符串,此无限循环将尝试创建一个无限长的字符串,当系统用完字符的内存时,它将失败。

要解决此问题,您可能应该在此代码中添加一些错误检查,以便如果流在提取过程中遇到错误,您的函数将退出而不是无限循环。

编辑: 正如@uk4321 所指出的,这里还有一个无限循环:

while(c != ',' || c!= ';') {
...
}

这句话总是正确的。每个字符只有一个值,因此每个字符将与 ; 中的至少一个进行比较。要解决此问题,请尝试将其重写为

while(c != ',' && c!= ';') {
...
}

希望这对您有所帮助!

关于c++ - 为什么我的重载 >> 运算符会抛出 bad_alloc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20320183/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com