Реализация перемещающего конструктора в шаблоне SharedPointer

Перемещающий конструктор забирает указатель на ресурс и общий счётчик, затем обнуляет оба поля источника. Счётчик ссылок при этом не увеличивается.

Короткий ответ

Что ответить на собеседовании

Перемещающий конструктор забирает указатель на ресурс и общий счётчик, затем обнуляет оба поля источника. Счётчик ссылок при этом не увеличивается.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо добавить в шаблонный класс SharedPointer конструктор перемещения, который после перемещения обнуляет указатели у исходного объекта.

Ответ

Перемещающий конструктор забирает указатель на ресурс и общий счётчик, затем обнуляет оба поля источника. Счётчик ссылок при этом не увеличивается.

Для полей T* resource и std::size_t* refCount внутри класса:

SharedPointer(SharedPointer&& other) noexcept
    : resource(other.resource), refCount(other.refCount) {
    other.resource = nullptr;
    other.refCount = nullptr;
}

Число владельцев не меняется: владение переходит от other к новому объекту. Деструктор перемещённого объекта должен корректно обрабатывать nullptr и не уменьшать переданный счётчик. noexcept полезен в том числе контейнерам, выбирающим между перемещением и копированием.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее