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