170 похожих чатов

Ребят, а когда мы с помощью erase() убираем из vector<T>

какой-то элемент, то память автоматически, которую он занимал, освобождается?

25 ответов

24 просмотра

Все элементы, которые следовали за ним, по цепочке сдвигаются левее. Свободная капасити как следствие вырастает на 1. Освобождения памяти не происходит.

Семен-Кропоткин Автор вопроса
Mikail Bagishov
Все элементы, которые следовали за ним, по цепочке...

Т.е, если, например, если я создал указатель и получил адрес 3-го элемента (100) vector<int> vect, в котором элементы { 1, 10, 100, 1000 }, то если я его уберу, то указатель всё еще будет указывать на значение 100? И при попытке обращения не будет никаких проблем?

Mikail Bagishov
Все элементы, которые следовали за ним, по цепочке...

Но деструктор вызовется, что и будет означать end of life удаленного элемента

Семен Кропоткин
Т.е, если, например, если я создал указатель и пол...

Кажется, по стандарту после указатель на 100 после erase() станет невалидным. Но на 100 он точно указывать не станет, сотни больше нет (а ее место занял другой объект)

Семен-Кропоткин Автор вопроса
Mikail Bagishov
Кажется, по стандарту после указатель на 100 после...

"Место занял другой объект", т.е этот указатель будет указывать на 1000, которая сдвинется влево?

Семен Кропоткин
"Место занял другой объект", т.е этот указатель бу...

Физически - да. Но еще раз повторюсь - кажется, пользоваться таким указателем уже нельзя.

Ivan Sokolov
если его промыть, то мб можно 🌚

я щас подумал. это смотря как вектор передвигает объекты при erase если operator=(T&&), то launder не нужен если dtor + T(T&&), то нужен

Ivan Sokolov
я щас подумал. это смотря как вектор передвигает о...

Какая разница? указатель указывает на валидный объект

Boris Usievich
Какая разница? указатель указывает на валидный объ...

Не указывает, если второй вариант. Будет, когда transparently-replaceable поддержат для подобъектов (тематический DR заводили уже).

Ivan Sokolov
я щас подумал. это смотря как вектор передвигает о...

там будет dtor гарантированно, это же уничтожение элемента

Sergey Anisimov
Не указывает, если второй вариант. Будет, когда tr...

гляжу в доку, про указатели ничего нет (забавно :), но ссылки и итераторы инвалидируются начиная от места удаления элемента.

Boris Usievich
гляжу в доку, про указатели ничего нет (забавно :)...

Указатель и ссылка в этом контексте не равнозначны?

Boris Usievich
гляжу в доку, про указатели ничего нет (забавно :)...

Я пока упускаю, к сожалению, где нормативно описывается invalidation (если вообще). Насчет указателей - это комментарий по подходу с деструктор + конструктор.

Boris Usievich
я не проф. толкователь стандарта :)

судя по тому что DR'ы на тему не прекращаются, там даже проф. толкователи ещё не всё вычесали

Boris Usievich
22.3.11.5 Modifiers [vector.modifiers] в C++20

Не, я вижу описание метода) Хотелось бы почитать именно про "Invalidates iterators and references": семантика должна же прописана быть (иначе действительно не ясно, при чем здесь те же указатели).

Sergey Anisimov
Не, я вижу описание метода) Хотелось бы почитать и...

Семантика простая, этими итераторами и ссылками нельзя пользоваться

Sergey Anisimov
Допустим. А с указателями что?)

Я бы предположил, что в данном контексте указатель и ссылка равнозначны. Разве есть какие-то контейнеры, для которых ссылки и указатели ведут себя по-разному? С итераторами - там да, вопрос отдельный

Андрей Таусинов
Я бы предположил, что в данном контексте указатель...

Моя претензия в том, что это все безосновательные предположения выходят. В нормативах должно быть настолько мало пространства для разночтения, насколько возможно.

Vlad
а вопрос какой?

Инвалидация указателей на элементы вектора после erase

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
2
Карта сайта