是否可以在 C++ 中添加到空双端队列的迭代器?
Should it be possible to add to an iterator of an empty deque in C++?
下面是导致问题的示例:
#include <deque>
int main() {
std::deque<int> has_data = {1, 2, 3};
std::deque<int>::iterator iter1 = has_data.begin() + 5; // This works fine
std::deque<int> had_data = {4, 5, 6};
had_data.clear();
std::deque<int>::iterator iter2 = had_data.begin() + 5; // This also works fine
std::deque<int> is_empty;
std::deque<int>::iterator iter3 = is_empty.begin() + 5; // This causes a segfault
}
如果双端队列以前从未包含过任何元素,则添加到空双端队列的迭代器似乎只是一个问题。
我很好奇这是否是 STL 中的错误,或者我是否只是以导致未定义行为的方式使用它。我只在使用 Xcode(GUI 和命令行)编译时遇到这个问题。我也在 Linux 上用 GCC 版本 6.2.0 尝试过,但问题似乎并不存在。
您 运行 遇到的问题是 未定义的行为 使用 +
运算符将迭代器向前跳到点之外越过容器的末端。因此,您正在执行的每个迭代器操作都会导致未定义的行为,并且恰好是前两种情况恰好不会崩溃而最后一种情况会崩溃。
(至于为什么这是未定义的行为:C++17 标准要求(§27.2.3/2),要递增迭代器,迭代器必须是 dereferencable,从某种意义上说,在递增迭代器之前取消引用它必须是安全和合法的。然后它说(§27.2.7/1)如果你在迭代器上使用 +
或 +=
,它应该具有与迭代执行 ++
适当次数相同的效果。因此,如果您将迭代器跳到容器末尾超过一步,在某个时候您将到达迭代器不可取消引用并将触发未定义行为的容器末尾。)
希望对您有所帮助!
I'm curious as to if this is a bug in the STL, or if I'm just using it in a way that causes undefined behavior. I only get this problem when compiling with Xcode (both the GUI and the command line).
您正在导致未定义的行为。
I have also tried it with GCC version 6.2.0 on Linux, but the problem didn't seem to exist there.
不,未定义的行为在那里以不同的方式表现出来;它在您尝试时并没有导致 SEGFAULT。 (虽然下次你可以试试)
下面是导致问题的示例:
#include <deque>
int main() {
std::deque<int> has_data = {1, 2, 3};
std::deque<int>::iterator iter1 = has_data.begin() + 5; // This works fine
std::deque<int> had_data = {4, 5, 6};
had_data.clear();
std::deque<int>::iterator iter2 = had_data.begin() + 5; // This also works fine
std::deque<int> is_empty;
std::deque<int>::iterator iter3 = is_empty.begin() + 5; // This causes a segfault
}
如果双端队列以前从未包含过任何元素,则添加到空双端队列的迭代器似乎只是一个问题。
我很好奇这是否是 STL 中的错误,或者我是否只是以导致未定义行为的方式使用它。我只在使用 Xcode(GUI 和命令行)编译时遇到这个问题。我也在 Linux 上用 GCC 版本 6.2.0 尝试过,但问题似乎并不存在。
您 运行 遇到的问题是 未定义的行为 使用 +
运算符将迭代器向前跳到点之外越过容器的末端。因此,您正在执行的每个迭代器操作都会导致未定义的行为,并且恰好是前两种情况恰好不会崩溃而最后一种情况会崩溃。
(至于为什么这是未定义的行为:C++17 标准要求(§27.2.3/2),要递增迭代器,迭代器必须是 dereferencable,从某种意义上说,在递增迭代器之前取消引用它必须是安全和合法的。然后它说(§27.2.7/1)如果你在迭代器上使用 +
或 +=
,它应该具有与迭代执行 ++
适当次数相同的效果。因此,如果您将迭代器跳到容器末尾超过一步,在某个时候您将到达迭代器不可取消引用并将触发未定义行为的容器末尾。)
希望对您有所帮助!
I'm curious as to if this is a bug in the STL, or if I'm just using it in a way that causes undefined behavior. I only get this problem when compiling with Xcode (both the GUI and the command line).
您正在导致未定义的行为。
I have also tried it with GCC version 6.2.0 on Linux, but the problem didn't seem to exist there.
不,未定义的行为在那里以不同的方式表现出来;它在您尝试时并没有导致 SEGFAULT。 (虽然下次你可以试试)