🤔 Расскажи о истории умных указателейИстория
умных указателей (smart pointers) в C++ связана с необходимостью управления динамической памятью и улучшением безопасности работы с указателями. Они появились как способ автоматизировать управление памятью и избежать ошибок, таких как утечки памяти, двойное освобождение или использование освобожденной памяти.
🚩Основные этапы развития умных указателей
🟠
Классические проблемы обычных указателейВ языке C++ динамическая память выделяется с помощью new и освобождается с помощью delete. Однако ручное управление памятью приводит к ошибкам:
Утечки памяти: забыли вызвать delete, и память остаётся занятой.
Двойное освобождение: дважды вызвали delete на одном указателе.
Использование освобождённой памяти: доступ к указателю после delete.
Эти проблемы стали мотиватором для появления решений, которые бы автоматически управляли памятью.
🟠
Ручная реализация умных указателей в C++98До стандартизации разработчики часто писали свои собственные классы для управления динамической памятью. Такой класс оборачивал указатель и вызывал delete в своём деструкторе:
class SmartPointer {
int* ptr;
public:
explicit SmartPointer(int* p = nullptr) : ptr(p) {}
~SmartPointer() { delete ptr; }
int& operator*() { return *ptr; }
int* operator->() { return ptr; }
};
🟠
Boost и развитие библиотеки умных указателейВ библиотеке Boost появились первые стандартизированные умные указатели:
boost::shared_ptr: реализует совместное владение указателем (reference counting).
boost::scoped_ptr: уникальное владение (аналог будущего std::unique_ptr).
boost::weak_ptr: слабая ссылка для работы с циклическими зависимостями.
Boost сыграл огромную роль в стандартизации умных указателей, так как многие из них легли в основу C++11.
🟠
C++11: стандартные умные указателиСтандарт C++11 ввёл библиотеку , которая предоставляет три типа умных указателей:
std::unique_ptr:
Гарантирует уникальное владение ресурсом.
Замена для обычных указателей с более строгими гарантиями.
Не поддерживает копирование, только перемещение.
std::unique_ptr ptr(new int(5));
std::shared_ptr:
Совместное владение ресурсом через подсчёт ссылок.
Освобождает память, когда последний shared_ptr указывает на объект.
std::shared_ptr sp1 = std::make_shared(10);
std::weak_ptr:
Не увеличивает счётчик ссылок в std::shared_ptr.
Используется для работы с циклическими зависимостями.
std::weak_ptr wp = sp1;
🟠
Современное использование умных указателейС выходом C++14, C++17 и C++20 умные указатели остаются важной частью языка. Они используются для:
Ресурсного управления (RAII).
Устранения утечек памяти.
Упрощения кода.
Ставь 👍 и забирай 📚 Базу знаний