Person* p
- это объект типа Pointer*
с автоматическим хранением («локальная переменная»). Этот указатель, как и любой объект с автоматическим хранением, существует только до конца области, в которой он был объявлен. Как только вы достигнете закрытия }
области действия блока, которую вы создали, больше не будет такой вещи, как p
, чтоуказатель перестал существовать
Хотя p
не существует, то, на что он раньше указывал, все еще существует. Ваш Person
слил и ушел. Без указателя или ссылки на него нет способа вернуть его назад и нет способа его очистить. Обязательно сохраняйте p
или другой указатель на него, пока вы не delete
сделаете это.
Перемещение объявления Person* p
за пределы области действия (или полное удаление искусственной области действия) решит эту проблему. В этом случае время жизни p
связано с областью действия main
и будет существовать к тому времени, когда вы попытаетесь std::cout
это age
член.
Рассмотрите возможность использования умных указателей нахотя бы избегайте таких утечек. std::unique_ptr<Person> p
автоматически delete
Person
, когда последний (и единственный) указатель перестает существовать.