我在这段代码中遇到分段错误:
#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最有害的后果之一:它可能看起来没问题。不是。