Умные указатели в C++: unique_ptr и shared_ptr

Умные указатели C++ (unique_ptr, shared_ptr) сами освобождают память — без ручного delete и утечек.

Умный указатель — это объект из заголовка <memory>, который владеет памятью и автоматически освобождает её, когда выходит из области видимости.

unique_ptr — единственный владелец

unique_ptr владеет объектом единолично. Память освобождается сама при выходе из области видимости — delete писать не нужно.

#include <iostream>
#include <memory>
using namespace std;

int main() {
    unique_ptr<int> p = make_unique<int>(10);
    cout << *p << "\n";
    *p = 20;
    cout << *p << "\n";
    return 0;                 // память освобождается автоматически
}

Вывод:

10
20

shared_ptr — совместное владение

shared_ptr считает, сколько указателей владеют объектом. Память освобождается, когда счётчик ссылок становится нулевым.

#include <iostream>
#include <memory>
using namespace std;

int main() {
    shared_ptr<int> a = make_shared<int>(5);
    shared_ptr<int> b = a;     // теперь объектом владеют оба
    cout << *a << " " << *b << "\n";
    cout << "ссылок: " << a.use_count() << "\n";
    return 0;
}

Вывод:

5 5
ссылок: 2

Коротко

  • Умные указатели живут в <memory> и сами освобождают память.
  • unique_ptr — один владелец; создаётся через make_unique.
  • shared_ptr — совместное владение со счётчиком ссылок; создаётся через make_shared.
Проверьте себя
1. Когда unique_ptr освобождает память?
AНикогда
BПри выходе из области видимости
CТолько после delete
DПо таймеру
2. Что отслеживает shared_ptr?
AРазмер объекта
BЧисло владельцев (счётчик ссылок)
CВремя жизни в секундах
DТип объекта
3. В каком заголовке живут умные указатели?
A<iostream>
B<memory>
C<vector>
D<pointer>
Поддержать проект