Sobes.tech
Назад к вопросам
Junior — Middle
83

Каким образом реализовать умный указатель std::shared_ptr в C++?

Компании, где спрашивали
ГК Адепт

Ответ от нейросети

sobes.tech AI

std::shared_ptr — это умный указатель в C++, который реализует подсчет ссылок для управления временем жизни объекта. Основная идея — хранить объект в куче и вести счетчик, сколько shared_ptr ссылаются на этот объект. Когда последний shared_ptr уничтожается или переназначается, объект автоматически удаляется.

Принцип работы:

  1. При создании shared_ptr выделяется память для объекта и счетчика ссылок (обычно в управляющем блоке).
  2. Каждый раз, когда shared_ptr копируется, счетчик увеличивается.
  3. При уничтожении shared_ptr счетчик уменьшается.
  4. Когда счетчик достигает нуля, вызывается деструктор объекта и освобождается память.

Пример упрощенной реализации:

#include <iostream>

template<typename T>
class SharedPtr {
    T* ptr;
    size_t* ref_count;

public:
    explicit SharedPtr(T* p = nullptr) : ptr(p), ref_count(new size_t(1)) {}

    SharedPtr(const SharedPtr& other) : ptr(other.ptr), ref_count(other.ref_count) {
        ++(*ref_count);
    }

    SharedPtr& operator=(const SharedPtr& other) {
        if (this != &other) {
            release();
            ptr = other.ptr;
            ref_count = other.ref_count;
            ++(*ref_count);
        }
        return *this;
    }

    ~SharedPtr() {
        release();
    }

    T& operator*() { return *ptr; }
    T* operator->() { return ptr; }

private:
    void release() {
        if (--(*ref_count) == 0) {
            delete ptr;
            delete ref_count;
        }
    }
};

int main() {
    SharedPtr<int> sp1(new int(10));
    {
        SharedPtr<int> sp2 = sp1;
        std::cout << *sp2 << std::endl; // 10
    } // sp2 уничтожается, счетчик уменьшается
    std::cout << *sp1 << std::endl; // 10
    return 0;
}

Это упрощенный пример, в реальной реализации учитываются дополнительные детали (потокобезопасность, касты, слабые указатели и т.д.).