Это, конечно, неопределенное поведение, как указывали другие.
Однако во многих реализациях C ++ это действительно не произойдет до тех пор, пока после вывода не произойдет, потому что указатель NULL
никогда не разыменовывается до этого момента.
Ваш main
по существу сводится к reinterpret_cast<Foo *>(nullptr)->method(0)
. Поскольку method
- это не virtual
метод class Foo
, который переводится в Foo::method(0)
(с this
, установленным в nullptr
).
Выходная строка вообще не ссылается на this
, поэтому только при обращении к m_list
сначала разыменовывается this
(и, следовательно, происходит сбой).
Если бы method
было virtual
, вызов к нему, скорее всего, прервался бы, как в типичных реализациях, вызовы virtual
методов разыменовывают this
.