Деструктор сначала проверяет наличие общего счётчика, затем уменьшает его. Только последний владелец удаляет объект и сам счётчик; иначе ресурс остаётся доступным другим владельцам.
Реализация деструктора в шаблоне SharedPointer
Деструктор сначала проверяет наличие общего счётчика, затем уменьшает его. Только последний владелец удаляет объект и сам счётчик; иначе ресурс остаётся доступным другим владельцам.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо добавить в шаблонный класс SharedPointer метод‑деструктор, который будет уменьшать счётчик ссылок и освобождать управляемый ресурс, когда счётчик достигает нуля.
Ответ
Деструктор сначала проверяет наличие общего счётчика, затем уменьшает его. Только последний владелец удаляет объект и сам счётчик; иначе ресурс остаётся доступным другим владельцам.
При полях T* resource и std::size_t* refCount:
~SharedPointer() noexcept {
if (refCount && --*refCount == 0) {
delete resource;
delete refCount;
}
}
Это предполагает корректный счётчик не меньше 1 у непустого владельца, одиночный объект и не бросающий деструктор T. Copy, move и присваивание обязаны сохранять тот же инвариант. Для массива нужен иной deleter; для конкурентных владельцев — потокобезопасный управляющий блок.