SharedPtr: реализация метода разрушения

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

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

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

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

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

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

Условие

Необходимо дополнить деструктор простого умного указателя SharedPtr. Он должен:

  1. Уменьшать счётчик владения объектом;
  2. При достижении нуля освобождать управляемый ресурс и сам счётчик.
template <class T>
class SharedPtr {
    int* refCount = nullptr;
    T* resource = nullptr;

public:
    SharedPtr() = default;

    SharedPtr(const SharedPtr& other) {
        resource = other.resource;
        refCount = other.refCount;
        (*refCount)++;
    }

    explicit SharedPtr(T* p) {
        refCount = new int(1);
        resource = p;
    }

    ~SharedPtr() {
        if (refCount && --(*refCount) == 0) {
            delete resource;
            delete refCount;
        }
    }
};

Ответ

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

~SharedPtr() {
    if (refCount && --*refCount == 0) {
        delete resource;
        delete refCount;
    }
}

Но весь класс ещё не безопасен: копирующий конструктор разыменовывает nullptr при копировании пустого указателя, а неявное присваивание не управляет счётчиком. Также нужно очищать принятый ресурс при ошибке создания refCount. Это схема для одного объекта, не для массива; счётчик без атомарной синхронизации не поддерживает конкурентное владение.

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

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

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

Подробнее