取消引用字符串向量的 .end() 时的行为

Behavior when dereferencing the .end() of a vector of strings

本文关键字:end 引用 字符串 向量 取消      更新时间:2023-10-16

我想知道通过取消引用 string s 的vector的端外iterator,将string设置为等于返回的任何内容是否"安全"。当我运行程序时

#include <vector>
#include <string>
int main()
{
    std::vector<std::string> myVec;
    std::cout << *myVec.end();
    return 0;
}

我收到以下错误。

/usr/local/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../../include/c++/4.1.2/debug/safe_iterator.h:181:
    error: attempt to dereference a past-the-end iterator.
Objects involved in the operation:
iterator "this" @ 0x0xffdb6088 {
type = N11__gnu_debug14_Safe_iteratorIN9__gnu_cxx17__normal_iteratorIPSsN10__gnu_norm6vectorISsSaISsEEEEEN15__gnu_debug_def6vectorISsS6_EEEE (mutable iterator);
  state = past-the-end;
  references sequence with type `N15__gnu_debug_def6vectorISsSaISsEEE' @ 0x0xffdb6088
}
Disallowed system call: SYS_kill

您可以在 http://codepad.org/fJA2yM30 查看它

我想知道这一切的原因是因为我的代码中有一个片段,就像

std::vector<const std::string>::iterator iter(substrings.begin()), offend(substrings.end());
while (true)
{
    this_string = *iter;
    if (_programParams.count(this_string) > 0)
    {
        this_string = *++iter;

我想确保如果++iter等于offend,就不会发生奇怪的事情.

你说:

我想知道通过取消引用字符串向量的场外迭代器将字符串设置为等于返回的任何字符串是否"安全"

不,这不安全。从 http://en.cppreference.com/w/cpp/container/vector/end

将迭代器返回到容器最后一个元素之后的元素。

此元素充当占位符;尝试访问它会导致未定义的行为。