То, что вы наблюдаете, является неопределенным поведением.Стек вызовов не изменяется на delete this;
и delete this
сам по себе всегда безопасен , но делает this
указатель недействительным , что означает, что вы больше не можете разыменовывать его.
Есть два возможных объяснения того, что вы наблюдаете.Либо рассматриваемая реализация просто не разыменовывает указатель this
для получения m_count
при возврате из функции - она загружается в регистр и просто использует это значение, поэтому this
не разыменовывается, и вы не делаетенаблюдайте за любой проблемой или когда delete
завершает работу, память, занятая объектом, все еще отображается в адресное пространство процесса и остается технически доступной, поэтому разыменование this
завершается успешно и m_count
успешно читается.Я полагаю, что последнее более вероятно.
Каким бы ни было объяснение этого неопределенного поведения, вы не можете на это полагаться, используйте то, что пользователь Remus Rusanu предлагает в своем ответе .