Поведение при разыменовании.end() вектора строк

Мне интересно, если это "безопасно" установить string равный тому, что возвращается путем разыменования офф-конца iterator из vector из strings. Когда я запускаю программу

#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,

1 ответ

Решение

Вы сказали:

Мне интересно, если это "безопасно", чтобы установить строку, равную тому, что возвращается, разыменовывая внешний итератор вектора строк

Нет, это не безопасно. С http://en.cppreference.com/w/cpp/container/vector/end

Возвращает итератор для элемента, следующего за последним элементом контейнера.

Этот элемент действует как заполнитель; попытка доступа к нему приводит к неопределенному поведению.

Другие вопросы по тегам