Вы не инициализировали *a
.
Попробуйте это:
#include <iostream>
class A
{
int num;
public:
void foo(){ std::cout<< "num="; num=5; std::cout<<num;}
};
int main()
{
A* a = new A();
a->foo();
return 0;
}
Не инициализация указателей (должным образом) может привести к неопределенному поведению. Если вам повезет, ваш указатель указывает на место в куче, которое предназначено для инициализации *. (Предполагая, что при этом не возникает никаких исключений.) Если вам не повезло, вы перезапишете часть памяти, используемой для других целей. Если вам действительно не повезло, это останется незамеченным.
Это не безопасный код; «хакер», вероятно, мог бы использовать его.
* Конечно, даже при доступе к этому местоположению нет гарантии, что оно не будет «инициализировано» позже.
«Lucky» (на самом деле, «повезло» затрудняет отладку вашей программы):
// uninitialized memory 0x00000042 to 0x0000004B
A* a;
// a = 0x00000042;
*a = "lalalalala";
// "Nothing" happens
«Не повезло» (облегчает отладку вашей программы, поэтому я не считаю ее «везучей», на самом деле):
void* a;
// a = &main;
*a = "lalalalala";
// Not good. *Might* cause a crash.
// Perhaps someone can tell me exactly what'll happen?