为什么我的重载>>运营商抛出bad_alloc?

时间:2013-12-02 03:02:11

标签: c++ operator-overloading istream

我已经定义了一个自定义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的位置。任何帮助或意见表示赞赏!

2 个答案:

答案 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并抛出异常。