Деструктор в условии уже содержит нужную логику: при непустом счётчике уменьшает его и удаляет ресурс вместе со счётчиком при нуле. Пустой объект безопасно игнорируется.
SharedPtr: реализация метода разрушения
Деструктор в условии уже содержит нужную логику: при непустом счётчике уменьшает его и удаляет ресурс вместе со счётчиком при нуле. Пустой объект безопасно игнорируется.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо дополнить деструктор простого умного указателя SharedPtr. Он должен:
- Уменьшать счётчик владения объектом;
- При достижении нуля освобождать управляемый ресурс и сам счётчик.
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. Это схема для одного объекта, не для массива; счётчик без атомарной синхронизации не поддерживает конкурентное владение.