firstdialog *dialog; // 这里你只是对firstdialog定义当时没有进行初始化。也就是没有分配内存给他,他是一个空指针。
dialog->show(); // 你对空指针进行show操作,是没有任何作用的。
如果你想使用指针,那么你就要显式分配内存。
firstdialog * dialog = new firstdialog;
这个表面你在堆(heap)上给firstdialog分配了实际可用的内存。
此时你在show,是可以的。
应当注意的是,如果你显示调用new来分配内存,你需要delete这个内存当你不再使用。
------
firstdialog dialog;
dialog.show();
这种方法是当你定义的时候程序在栈(stack)上自动给你分配内存,所以你调用show是可以立即执行的。
这样的方法是不需要管内存回收的问题。
应当注意的是,之所以有两种方式是因为堆(heap)是由程序员自由控制,而且这部分内存大小可以自由使用,而栈(stack)资源是有限的,当你需要分配很大的内存给变量时,你最好不要使用栈。
栈在生存期外就会自动释放。
比如
{
firstdialog dialog;
dialog.show();
} // 这里释放掉dialog