какой-то элемент, то память автоматически, которую он занимал, освобождается?
Все элементы, которые следовали за ним, по цепочке сдвигаются левее. Свободная капасити как следствие вырастает на 1. Освобождения памяти не происходит.
Т.е, если, например, если я создал указатель и получил адрес 3-го элемента (100) vector<int> vect, в котором элементы { 1, 10, 100, 1000 }, то если я его уберу, то указатель всё еще будет указывать на значение 100? И при попытке обращения не будет никаких проблем?
Но деструктор вызовется, что и будет означать end of life удаленного элемента
Кажется, по стандарту после указатель на 100 после erase() станет невалидным. Но на 100 он точно указывать не станет, сотни больше нет (а ее место занял другой объект)
"Место занял другой объект", т.е этот указатель будет указывать на 1000, которая сдвинется влево?
Физически - да. Но еще раз повторюсь - кажется, пользоваться таким указателем уже нельзя.
Окей, спасибо большое.
если его промыть, то мб можно 🌚
я щас подумал. это смотря как вектор передвигает объекты при erase если operator=(T&&), то launder не нужен если dtor + T(T&&), то нужен
Какая разница? указатель указывает на валидный объект
Не указывает, если второй вариант. Будет, когда transparently-replaceable поддержат для подобъектов (тематический DR заводили уже).
там будет dtor гарантированно, это же уничтожение элемента
гляжу в доку, про указатели ничего нет (забавно :), но ссылки и итераторы инвалидируются начиная от места удаления элемента.
Указатель и ссылка в этом контексте не равнозначны?
я не проф. толкователь стандарта :)
Я пока упускаю, к сожалению, где нормативно описывается invalidation (если вообще). Насчет указателей - это комментарий по подходу с деструктор + конструктор.
судя по тому что DR'ы на тему не прекращаются, там даже проф. толкователи ещё не всё вычесали
22.3.11.5 Modifiers [vector.modifiers] в C++20
Не, я вижу описание метода) Хотелось бы почитать именно про "Invalidates iterators and references": семантика должна же прописана быть (иначе действительно не ясно, при чем здесь те же указатели).
Семантика простая, этими итераторами и ссылками нельзя пользоваться
Допустим. А с указателями что?)
Я бы предположил, что в данном контексте указатель и ссылка равнозначны. Разве есть какие-то контейнеры, для которых ссылки и указатели ведут себя по-разному? С итераторами - там да, вопрос отдельный
Моя претензия в том, что это все безосновательные предположения выходят. В нормативах должно быть настолько мало пространства для разночтения, насколько возможно.
Инвалидация указателей на элементы вектора после erase
Обсуждают сегодня