空集"Out of bound iterator"



我在这段代码中遇到分段错误:

#include <iostream>
#include <set>
int main() {
std::set<int> st;
auto rf = --st.end();
std::cout << "Size of the set is: " << (int) st.size() << std::endl;
if ( (int) st.size() > 0) { // size of st is zero here
int foo = (*rf);  // rf is out bound
std::cout << "foo: " << foo << std::endl;
}
}

由于st是空的,无论rf出界,if条件永远不会为真。如果我注释掉if块,那么程序运行良好。

我也用std::vector尝试过,它运行良好。

为什么会出现分段错误?为什么"如果条件与无效语句一起总是 false"会影响代码的运行?

编译方式:

g++ -Wall -Wextra -Wshadow -Wfloat-equal -pedantic -std=c++17 -Wconversion -lm test.cpp

这是未定义的行为:

std::set<int> st;
auto rf = --st.end();

由于st是空的,因此st.begin() == st.end()和递减这两个(和相同的(迭代器中的任何一个都是格式不正确的。

我也用矢量尝试过并且运行良好。

这是UB最有害的后果之一:它可能看起来没问题。不是。

相关内容

  • 没有找到相关文章

最新更新