【问题标题】:Non Initialized Pointers in QTQT中的非初始化指针
【发布时间】:2014-02-05 21:08:13
【问题描述】:

在 QT 中,我遵循在头文件中编写接口的方式,然后在 .cpp 文件中实现。就我而言,我有一个 MainApplication 和两个对话框作为 MainApplication 的子项

所以在 MainApplication Header 中,两个未初始化的指针指向两个 Dialogs

 MemberForm *memberForm;
AboutForm *aboutUsForm;

据我所知,指针将为 Null,并且以下条件的计算结果为 true

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

据我所知,所有未初始化的指针都是 NULL 指针,所以这对我来说很奇怪。是什么让删除标头中的一个指针更奇怪的是,条件评估为真

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

条件评估为真

memberForm == NULL //True 

感谢任何回复。 PS:如果你要对帖子投反对票,请留下评论解释原因..

【问题讨论】:

  • 你的第二个测试只是“运气”,那些成员不会被初始化,你需要自己做。
  • 在 C++ 中,指针在没有显式赋值的情况下不会初始化为 NULL/nullptr。默认值是未定义的,在大多数情况下将指向未初始化的内存。在某些设置中,例如使用 MSVC 进行调试构建,编译器可能碰巧决定将值初始化为 null,但这根本不是您可以依赖的 - 它已经在发布构建中中断。跨度>
  • @Mat 是的,我是个幸运的男孩 :D 看来我必须学习更多..

标签: c++ qt pointers


【解决方案1】:

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

一般来说,在 C++ 中,指向分配在堆上的对象的原始指针无疑是一种自取其辱的方式,并且通常是糟糕设计的标志。将 C 的不安全方面拖到 C++ 中确实没有意义。你拥有 C++ 的力量,用它来帮助自己。

QScopedPointer 这样的智能指针具有更健全的行为,您应该改用它。

  1. 您可以检查它是否已初始化。

  2. 您无需担心删除指向的值。当智能指针被破坏时,它将被自动删除——编译器生成的析构函数代码为携带智能指针的类运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 2011-04-10
    • 2016-11-09
    • 1970-01-01
    • 2011-06-24
    • 2016-12-11
    相关资源
    最近更新 更多