Back to questions
Junior — Middle
84
Каким образом реализовать умный указатель std::shared_ptr в C++?
Companies where asked
ГК Адепт
Answer from AI
sobes.tech AI
std::shared_ptr — это умный указатель в C++, который реализует подсчет ссылок для управления временем жизни объекта. Основная идея — хранить объект в куче и вести счетчик, сколько shared_ptr ссылаются на этот объект. Когда последний shared_ptr уничтожается или переназначается, объект автоматически удаляется.
Принцип работы:
- При создании
shared_ptrвыделяется память для объекта и счетчика ссылок (обычно в управляющем блоке). - Каждый раз, когда
shared_ptrкопируется, счетчик увеличивается. - При уничтожении
shared_ptrсчетчик уменьшается. - Когда счетчик достигает нуля, вызывается деструктор объекта и освобождается память.
Пример упрощенной реализации:
#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;
}
Это упрощенный пример, в реальной реализации учитываются дополнительные детали (потокобезопасность, касты, слабые указатели и т.д.).