2014-01-16 54 views
0

在QT中,我遵循在头文件中编写接口的方式,然后在.cpp文件中执行。在我来说,我有一个MainApplication和两个对话框作为MainApplicationQT中的非初始化指针

所以在MainApplication头的孩子,两个未初始化指针两个对话框

MemberForm *memberForm; 
AboutForm *aboutUsForm; 

据我知道指针会是null,并且此下列条件计算为真

memberForm == NULL //False 
aboutUsForm == NULL //False 

据我知道,所有非初始化的指针是NULL指针,所以这是奇怪我。是什么使得它更奇怪的是去除标头中的指针之一,条件判断为真

MemberForm *memberForm; 
//AboutForm *aboutUsForm; // Removing the pointer 

条件计算真正

memberForm == NULL //True 

我明白任何回应。 PS:如果你想downvote帖子请留下评论解释为什么..

+1

你的第二个测试只是“运气”,这些成员不会被初始化,你需要自己做。 – Mat

+2

在C++中,没有明确的赋值,指针不会被初始化为NULL/nullptr。缺省值是未定义的,并且在大多数情况下将指向未初始化的内存。在某些设置中,如使用MSVC进行调试构建,编译器*可能会碰巧决定使用null初始化值,但这是您完全可以依赖的任何设置 - 它将在发布版本中断开。 –

+0

@Mat是的,我是一个幸运的男孩:D 它看起来,我必须学习更多.. –

回答

0

原始(“裸”)堆分配对象的指针成员不是初始化在C或C + +。它们的值是未定义的,并且在第一次初始化之前不能被依赖。无论你有什么价值,你都是巧合而非设计。

通常情况下,在C++堆中分配给堆的对象的原始指针是一种在脚中拍摄自己的肯定的方式,并且往往是设计不好的标志。将C的不安全方面拖到C++中确实没有意义。你有C++的力量,用它来帮助你自己。

一个智能指针,如QScopedPointer,有更明智的行为,你应该使用它。

  1. 你可以检查它是否被初始化。

  2. 您不必担心删除指向的值。当智能指针被破坏时它会被自动删除 - 当编译器生成的析构函数代码为那个携带智能指针的类运行时。