Как уже говорили другие, вам просто повезло, что вызванное вами неопределенное поведение выглядит так, как вы ожидали (по сути, потому что ваш Test :: bla () почти похож на глобальную свободную функцию). Чтобы увидеть ваш пример сбоев и прожигов, просто добавьте несколько нетривиальных членов класса:
class Test {
public:
void bla(void) {
std::cout << "test: " << x << std::endl;
};
int x;
};
Вы можете представить свой оригинальный пример как бесплатную функцию
void bla(Test * p) { std::cout << "test" << std::endl; }
, который вы просто вызываете с параметром мусора, но поскольку вы не используете этот параметр, ничего плохого не происходит. В моем модифицированном примере мы пытаемся получить доступ к p->x
и умереть.