在抛出 'std::length_error' 的实例后调用终止
Posted
技术标签:
【中文标题】在抛出 \'std::length_error\' 的实例后调用终止【英文标题】:terminate called after throwing an instance of 'std::length_error'在抛出 'std::length_error' 的实例后调用终止 【发布时间】:2010-05-23 17:10:02 【问题描述】:这是我在这里的第一篇文章。由于我是新手,这个问题可能很愚蠢。我正在编写一段代码,同时显示以下错误消息,
在抛出 'std::length_error' 的实例后调用终止
what(): basic_string::_S_create
/home/gcj/finals /home/gcj/quals 中止
以下是有问题的代码,尤其是第 39 行到第 52 行。这对我来说很奇怪,因为这段代码与 Line64 到 Line79 几乎相同。
int main()
std::vector<std::string> dirs, need;
std::string tmp_str;
std::ifstream fp_in("small.in");
std::ofstream fp_out("output");
std::string::iterator iter_substr_begin, iter_substr_end;
std::string slash("/");
int T, N, M;
fp_in>>T;
for (int t = 0; t < T; t++)
std::cout<<" time "<< t << std::endl;
fp_in >> N >> M;
for (int n =0; n<N; n++)
fp_in>>tmp_str;
dirs.push_back(tmp_str);
tmp_str.clear();
for (int m=0; m<M; m++)
fp_in>>tmp_str;
need.push_back(tmp_str);
tmp_str.clear();
for (std::vector<std::string>::iterator iter = dirs.begin(); iter!=dirs.end(); iter++)
for (std::string::iterator iter_str = (*iter).begin()+1; iter_str<(*iter).end(); ++iter_str)
if ((*iter_str)=='/')
std::string tmp_str2((*iter).begin(), iter_str);
if (find(dirs.begin(), dirs.end(), tmp_str2)==dirs.end())
dirs.push_back(tmp_str2);
for (std::vector<std::string>::iterator iter_tmp = dirs.begin(); iter_tmp!= dirs.end(); ++iter_tmp)
std::cout<<*iter_tmp<<" ";
dirs.clear();
std::cout<<std::endl;
std::cout<<" need "<<std::endl;
//processing the next
for (std::vector<std::string>::iterator iter_tmp = need.begin(); iter_tmp!=need.end(); ++iter_tmp)
std::cout<<*iter_tmp<<" ";
std::cout<<" where ";
for (std::vector<std::string>::iterator iter = need.begin(); iter!=need.end(); iter++)
for (std::string::iterator iter_str = (*iter).begin()+1; iter_str<(*iter).end(); ++iter_str)
if ((*iter_str)=='/')
std::string tmp_str2((*iter).begin(), iter_str);
if (find(need.begin(), need.end(), tmp_str2)==need.end())
need.push_back(tmp_str2);
for (std::vector<std::string>::iterator iter_tmp = need.begin(); iter_tmp!= need.end(); ++iter_tmp)
std::cout<<*iter_tmp<<" ";
need.clear();
std::cout<<std::endl;
//finish processing the next
for (std::vector<std::string>::iterator iter= dirs.begin(); iter!=dirs.end(); iter++)
std::cout<<*iter<<" ";
std::cout<<std::endl;
for (std::vector<std::string>::iterator iter= need.begin(); iter!=need.end(); iter++)
std::cout<<*iter<<" ";
std::cout<<std::endl;
fp_out.close();
最好的问候, 标记
【问题讨论】:
请标记第 39 到 52 行。SO 中没有行号。 看起来你做了很多工作来强制dirs
和 need
是独一无二的。也许从vector
切换到set
,它会自动完成。
除非你让事情变得简单,否则人们不会提供帮助。 1)代码不完整,无法编译。 2)如果没有相同的输入文件,我们如何以与您相同的方式对其进行测试? 3)你的行号不太可能与其他人的行号匹配(用注释标记错误代码)。
我怀疑这是你的问题,但你应该使用!=
而不是<
来比较迭代器。 <
将因内存容器中的非顺序(例如 set、map)而失败。
【参考方案1】:
您在迭代它们时将项目添加到 dirs
和 need
向量。这是不允许的:如果添加一个项目需要重新分配,它将使所有现有的迭代器失效,并且在您下次访问它们时可能会导致各种错误。
【讨论】:
【参考方案2】:我不知道什么是正确的方法,但由于很难找到这个答案,我就把它放在这里。 “terminate called after throwing 'foo'
”只是表示异常未被任何try ... catch
子句捕获。
【讨论】:
以上是关于在抛出 'std::length_error' 的实例后调用终止的主要内容,如果未能解决你的问题,请参考以下文章
关于在抛出 'std::length_error' 实例后调用终止
在抛出 'std::length_error' what(): basic_string::_S_create 的实例后调用终止
c++ 中的错误:“在抛出 'std::length_error'what() 的实例后调用终止:basic_string::_M_replace_aux”
理解错误“在抛出 'std::length_error'what() 实例后调用终止:basic_string::_S_create Aborted (core dumped)”
抛出“std::length_error”实例后调用 C++ 终止,what(): basic_string::_M_create