Информация об изменениях

Сообщение Re: Exception-safe vector от 19.12.2022 16:35

Изменено 19.12.2022 16:40 Sm0ke

Re: Exception-safe vector
Здравствуйте, Максим, Вы писали:

М>Тут смотрю Mock-интервью по плюсам, в одном из них попросили написать человека класс vector. Заинтересовал подход для реализации метода resize, у них он называется "подход с vector_base", с 57:10 про него говорят. Это про то, как обрабатывать ситуацию, когда во время resize удалось выделить новый буфер под данные, но при копировании в него какой-то конструктор копирования бросил исключение и теперь, для всех скопированных элементов надо вызвать деструктор. Никто не сталкивался с таким? И еще вопрос, как вам факт использования try/catch в классе вектора, не режет глаз? Нельзя ли без него как-то обойтись (видимо надо будет использовать RAII обертку)?


М>https://youtu.be/n5ddGADQIqY?t=3431


Если через конструктор копирования, то можно и через обёртку (без try).

В теле функции объявляем новый вектор. Пошагово копируем и увеличиваем count. При исключении новый вектор удалит только скопированные объекты с валидным count.

Если исключения нет, то:
Потом свапаем impl с this, в котором делаем count = 0. Новый вектор со старым буфером удалится при выходе из функции как обычная локальная переменная.

А если move конструкторы, то как? Не мувать же их обратно... Или move конструктор элементов должен быть noexcept.
Re: Exception-safe vector
Здравствуйте, Максим, Вы писали:

М>Тут смотрю Mock-интервью по плюсам, в одном из них попросили написать человека класс vector. Заинтересовал подход для реализации метода resize, у них он называется "подход с vector_base", с 57:10 про него говорят. Это про то, как обрабатывать ситуацию, когда во время resize удалось выделить новый буфер под данные, но при копировании в него какой-то конструктор копирования бросил исключение и теперь, для всех скопированных элементов надо вызвать деструктор. Никто не сталкивался с таким? И еще вопрос, как вам факт использования try/catch в классе вектора, не режет глаз? Нельзя ли без него как-то обойтись (видимо надо будет использовать RAII обертку)?


М>https://youtu.be/n5ddGADQIqY?t=3431


Если через конструктор копирования, то можно и через обёртку (без try).

В теле функции объявляем новый вектор. Пошагово копируем и увеличиваем count. При исключении новый вектор удалит только скопированные объекты с валидным count.

Если исключения нет, то:
Потом свапаем impl с this. Новый вектор со старым буфером удалится при выходе из функции как обычная локальная переменная.

А если move конструкторы, то как? Не мувать же их обратно... Или move конструктор элементов должен быть noexcept.