Указатель - это переменная, содержащая адрес какого-либо другого объекта в памяти. Переменная указателя может быть выделена:
- в стеке (как локальная
auto
переменная в блоке функции или оператора)
- статически (как глобальная переменная или статический член класса)
- в куче (как объект
new
или как член объекта класса)
Объект, на который указывает указатель (ссылки), также может быть размещен и в этих трех местах. Вообще говоря, объект, на который указывают, выделяется с помощью оператора new
.
Локальные переменные выходят из области видимости, когда поток программы покидает блок (или функцию), в котором они объявлены, т.е. их присутствие в стеке исчезает. Аналогично, переменные-члены объекта исчезают, когда их родительский объект выходит из области видимости или удаляется из кучи.
Если указатель выходит из области видимости или его родительский объект удаляется, объект, на который указывает указатель, все еще существует в памяти. Таким образом, практическое правило: любой код, который выделяет (news
) объект , владеет объектом и должен также delete
этот объект, когда он больше не нужен.
Авто-указатели убирают часть рутинной работы с управления указанным объектом. Объект, который был выделен через auto_ptr
, удаляется, когда этот указатель выходит из области видимости. Объект может быть присвоен от его владельца auto_ptr
другому auto_ptr
, который передает владение объектом второму указателю.
Ссылки по сути являются замаскированными указателями, но это тема для другого обсуждения.