我有以下的C++代码:
我正在无条件地创建一个指向向量最后一个元素的指针,但只有在向量不为空的情况下才对指针进行解引用。根据标准,这样做是否合法?或者上述代码是否存在未定义行为?
如果上述程序是合法的,那么下面的程序是否也合法?
void bar(int&);
void baz();
void foo(std::vector<int>& v) {
int* pointer_to_last = v.data() + (v.size() - 1);
if (v.size() > 0 && *pointer_to_last == 42) {
bar(*pointer_to_last);
} else {
baz();
}
}
我正在无条件地创建一个指向向量最后一个元素的指针,但只有在向量不为空的情况下才对指针进行解引用。根据标准,这样做是否合法?或者上述代码是否存在未定义行为?
如果上述程序是合法的,那么下面的程序是否也合法?
void bar(int&);
void baz();
void foo(std::vector<int>& v) {
int& reference_to_last = v.back();
if (v.size() > 0 && reference_to_last == 42) {
bar(reference_to_last);
} else {
baz();
}
}
在空容器上调用back会导致未定义的行为。
所以我假设这个程序是不合法的。是否有GCC或Clang的编译器标志或任何静态分析工具可以对上述代码给出警告?
v
的v.size()-1
不会溢出吗?无论如何,在空向量上,我认为我们对v.data()
没有太多的保证,我会支持@HolyBlackCat的观点。 - undefinedback()
只是对数组进行索引。与通过指针访问相比,它不会多花费一纳秒的时间。 - undefinedv.size() - 1
会导致溢出,但由于v.size()
是无符号的,所以这不是一个错误。错误发生在将该值添加到向量数据指针时。 - undefined