Умные указатели
Вместо указателей языка C рекомендуется использовать умные указатели:
- unique_ptr – уникальный, при уничтожении указателя удаляется и объект, при присваивании и копировании указателей передается владение объектом, а старый указатель обнуляется.
- shared_ptr – с подсчетом ссылок на объект, когда количество указателей на этот объект (или какую-то его часть) становится равно нулю, объект удаляется.
- weak_ptr – вспомогательный, не учитывается при подсчете ссылок, но с помощью метода expired позволяет обнаружить, что объект был удален.
У всех типов указателей перегружены операции -> и *(разыменования), а с помощью метода get можно получить обычный указатель.
struct data {int x; };
{ unique_ptr<data> p1(new data);
p1->x=1;
//
}
{ shared_ptr<data> p1(new data),p2;
weak_ptr<data> p3;
p2=p1;
p3=p1;
p1=nullptr;
p2=nullptr;
//
if(!p3.expired()) p3->x=1;
}
Для указателей на массивы, которые требуют специального деструктора, в качестве параметра шаблона нужно указать тип[]. Также вместо операций разыменования (
*) и
-> появляется операция индексации:
{ unique_ptr<int[]> arr{new int[10]};
arr[1]=10;
// автоматическое уничтожение объекта
}