yot*_*cal 1 c++ iterator stl stddeque c++17
以下是导致问题的原因的示例:
#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
}
Run Code Online (Sandbox Code Playgroud)
如果双端队列之前从未包含任何元素,则添加到空双端队列的迭代器似乎只是一个问题。
我很好奇这是否是 STL 中的错误,或者我是否只是以导致未定义行为的方式使用它。我只在使用 Xcode(GUI 和命令行)编译时遇到这个问题。我也在 Linux 上使用 GCC 6.2.0 版尝试过它,但那里似乎不存在问题。
您在这里遇到的问题是,使用运算符将迭代器向前跳转到超出容器末端的位置是未定义的行为+。因此,您正在执行的每个迭代器操作都会导致未定义的行为,而且恰好是前两种情况巧合地不会崩溃而最后一种情况会发生这种情况。
(至于为什么这是未定义的行为:C++17 标准要求(第 27.2.3/2 节),要增加迭代器,迭代器必须是dereferencable,因为它必须安全且合法地取消引用迭代器在你增加它之前。然后它说 (§27.2.7/1) 如果你使用+或+=在迭代器上,它应该具有与迭代++执行适当次数相同的效果。因此,如果你跳转迭代器越过容器的末尾一步,在某个时刻,您将到达容器的末尾,在该处迭代器不可取消引用,并且会触发未定义的行为。)
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
87 次 |
| 最近记录: |