Умные указатели в 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>