SharedPtr: реализация копирующего конструктора

После копирования rawPtr и refCount нужно выполнить if (refCount) ++*refCount. Проверка нужна для копирования пустого SharedPtr.

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

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

После копирования rawPtr и refCount нужно выполнить if (refCount) ++*refCount. Проверка нужна для копирования пустого SharedPtr.

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

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

Условие

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

template <class T>
class SharedPtr {
    int* refCount = nullptr;
    T* rawPtr = nullptr;

public:
    SharedPtr() = default;

    SharedPtr(const SharedPtr& other) {
        rawPtr = other.rawPtr;
        refCount = other.refCount;
        // увеличиваем счётчик ссылок
    }

    SharedPtr(T* ptr) {
        rawPtr = ptr;
        refCount = new int(1);
    }
};

Ответ

После копирования rawPtr и refCount нужно выполнить if (refCount) ++*refCount. Проверка нужна для копирования пустого SharedPtr.

SharedPtr(const SharedPtr& other)
    : refCount(other.refCount), rawPtr(other.rawPtr) {
    if (refCount) ++*refCount;
}

Это фрагмент внутри исходного шаблона. Создавать отдельный счётчик нельзя: все копии должны совместно управлять одним ресурсом. В представленном классе ещё отсутствуют деструктор и безопасное присваивание, поэтому одна эта правка не делает реализацию готовым shared_ptr. Также следует обработать исключение при выделении счётчика в конструкторе от T*, чтобы не потерять переданный ресурс.

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

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

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

Подробнее