Что пришло на смену auto_ptr

Стандартной заменой для `auto_ptr`, который был устаревшим с версии C++11, стали умные указатели `unique_ptr` и `shared_ptr`. Эти умные указатели представляют собой более безопасные и гибкие альтернативы `auto_ptr`, которые лучше интегрируются с новыми возможностями языка и обеспечивают лучшее управление ресурсами.

`unique_ptr`
Это умный указатель, который предоставляет строгую семантику владения над объектом в памяти на основе правила одного владельца. То есть, в любой момент времени только один `unique_ptr` может владеть объектом. Когда `unique_ptr` выходит из области видимости, объект, на который он указывает, автоматически уничтожается. Это исключает риски связанные с висячими указателями, двойным освобождением памяти и утечками памяти.

```cpp
#include <memory>

int main() {
    std::unique_ptr<int> ptr(new int(10)); // Инициализация unique_ptr
    *ptr = 20; // Доступ к данным
    // нет необходимости вызывать delete, так как unique_ptr автоматически освободит память
    return 0;
}
```

`shared_ptr`
Управляет объектом через счётчик ссылок. Каждый `shared_ptr`, который указывает на один и тот же объект, участвует в управлении жизненным циклом этого объекта. Когда последний `shared_ptr`, указывающий на объект, выходит из области видимости или прекращает указывать на объект, объект уничтожается. Это делает `shared_ptr` идеальным выбором для использования в контейнерах, различных структурах данных и для реализации графов или деревьев с общими узлами.

```cpp
#include <memory>

void process(std::shared_ptr<int> ptr) {
    (*ptr)++;
}

int main() {
    std::shared_ptr<int> ptr = std::make_shared<int>(10);
    process(ptr); // ptr передаётся и используется в функции
    // объект будет жить до тех пор, пока на него есть активные ссылки
    return 0;
}
```

`unique_ptr` и `shared_ptr` являются мощными инструментами современного, которые обеспечивают автоматическое управление памятью, что значительно снижает вероятность возникновения ошибок связанных с неправильным управлением ресурсами, которые были характерны для `auto_ptr`. `unique_ptr` используется, когда один объект должен владеть другим, в то время как `shared_ptr` подходит для случаев, когда несколько объектов должны делиться владением.

May 22, 2024, easyoffer