Я думаю, вы можете быть смущены уровнем косвенности здесь. Когда экземпляр уничтожается, каждый элемент данных действительно уничтожается вместе с ним. В вашем случае, когда M
уничтожается и вызывается M::~M()
, его переменная n
действительно уничтожается. Проблема в том, что n
- это N *
, поэтому, пока указатель уничтожен, он не указывает.
delete
не работает так. Рассмотрим ваше простое утверждение:
delete n;
Вышеприведенное утверждение уничтожает объект, на который указывает n
, который является объектом типа N
. Он не уничтожает n
, который является указателем N *
.
Существует очень веская причина, по которой M::~M()
не вызывает автоматически delete n;
, а именно: упомянутый объект N
может быть разделен между несколькими M
объектами, и если один M
был уничтожен, остальные потеряли бы N
, на которые они указывали, оставив повсюду ужасные свисающие указатели. C ++ не пытается интерпретировать, что вы имели в виду , что делать с вашими указателями, он просто делает то, что вы сказали , что делать.
Короче говоря, M
действительно уничтожает всех своих членов, когда он уничтожен, просто это разрушение не делает то, что, как вы думаете, должно делать. Если вам нужен тип указателя, который получает владение объектом и уничтожает его при уничтожении указателя, посмотрите на std::auto_ptr
.