Инкремент счётчика ссылок при копирующем присваивании

Новый общий счётчик надо увеличить до освобождения прежнего владения. Нельзя просто вызвать деструктор текущего объекта и продолжить пользоваться его полями: это завершает время жизни объекта.

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

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

Новый общий счётчик надо увеличить до освобождения прежнего владения. Нельзя просто вызвать деструктор текущего объекта и продолжить пользоваться его полями: это завершает время жизни объекта.

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

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

Условие

Необходимо реализовать увеличение счётчика ссылок в операторе присваивания собственного умного указателя CustomSharedPtr.

CustomSharedPtr& operator=(const CustomSharedPtr& p) {
    if (p.resource != this->resource) {
        ~CustomSharedPtr();
        this->resource = p.resource;
        this->refCount = p.refCount;
    }
    return *this;
}

Ответ

Новый общий счётчик надо увеличить до освобождения прежнего владения. Нельзя просто вызвать деструктор текущего объекта и продолжить пользоваться его полями: это завершает время жизни объекта.

При соглашении, что refCount — указатель на счётчик, а nullptr означает пустое владение, схема такая:

CustomSharedPtr& operator=(const CustomSharedPtr& p) {
    if (this == &p) return *this;
    auto* nextResource = p.resource;
    auto* nextCount = p.refCount;
    if (nextCount) ++*nextCount;
    release();
    resource = nextResource;
    refCount = nextCount;
    return *this;
}

release() уменьшает старый счётчик, удаляет ресурс и счётчик при нуле и очищает поля, но не уничтожает сам CustomSharedPtr. Сравнение только resource ненадёжно: владение определяется управляющим блоком. Это однопоточная схема; конкурентное управление требует отдельной синхронизации.

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

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

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

Подробнее