После копирования rawPtr и refCount нужно выполнить if (refCount) ++*refCount. Проверка нужна для копирования пустого SharedPtr.
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*, чтобы не потерять переданный ресурс.