Sobes.tech
Junior — Senior
58

Неправильная инициализация в конструкторе SharedPtr: какие последствия

Условие задачи

Что произойдёт, если выполнить приведённый ниже код? Нужно проанализировать реализацию конструктора SharedPtr(T* p): корректно ли он инициализирует внутренний указатель и что происходит с переданным указателем p.

int* raw = new int;
std::shared_ptr<int> sp(raw);

template <class T>
class SharedPtr {
    int* counterPtr = nullptr;
    T* dataPtr = nullptr;

public:
    SharedPtr() = default;

    SharedPtr(const SharedPtr& other) {
        dataPtr = other.dataPtr;
        counterPtr = other.counterPtr;
        (*counterPtr)++;
    }

    SharedPtr(T* rawPtr) {
        counterPtr = new int(0);
        dataPtr = new T;  // проблема здесь
    }
};