c++ - 未初始化的指针就像已初始化一样工作

标签 c++ qt

这是一些 Qt 代码:(5.1.1)

QTreeWidgetItem *rootItem;

rootItem->setText(0, "Column 1");
rootItem->setText(1, "Column 2");
rootItem->setText(2, "Column 3");
rootItem->setText(3, "Column 4");

ui->treeWidget->addTopLevelItem(rootItem);

Messages::ShowMessage(rootItem->childCount());

上面的代码有效,人们会期望运行时错误,因为 rootItem 未初始化但它仍然有效。我在这里错过了什么?我正在使用 Qt Creator。

他们是否进行了某种自动初始化?如果是,我在哪里关闭它?我运行程序,得到 4 列。这没有意义。

但是,当我尝试实际初始化指针时,我只得到 1 列。

QTreeWidgetItem *rootItem = new QTreeWidgetItem(ui->treeWidget);

rootItem->setText(0, "Column 1");
rootItem->setText(1, "Column 2");
rootItem->setText(2, "Column 3");
rootItem->setText(3, "Column 4");

ui->treeWidget->addTopLevelItem(rootItem);

我错过了什么?

最佳答案

这是未定义的行为,所以当您遇到它们时,您不能指望任何逻辑上合理或一致的行为。

但是实际上,您可以通过将指针设置为 nullptrNULL 来提高运行时系统检测到此类错误的机会。

QTreeWidgetItem *rootItem = nullptr;

在 Debug模式下运行您的程序也可能有所帮助,许多现代编译器在检测到这些时会发出诊断和警告(您应该始终启用它们,将它们设置为最高、最偏执的级别)。

但请注意,以上内容并不能保证任何事情,您仍然需要编写正确且行为良好的代码。

这里又出现了过多的建议,让你使用普通对象(堆栈分配的、非指针指向的对象),或者如果你不能(比如,如果你可怜的图书馆对它们过敏 [1]),始终使用指针包装器,例如 std::unique_ptrstd::shared_ptr,或者您的库提供并能够消化的东西.


[1] 我不喜欢那些类型的库。

关于c++ - 未初始化的指针就像已初始化一样工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20066503/

相关文章:

c++ - bind() 和 listen() 函数出错 (WinSock)

c++ - 在 QRubberband 上实现调整大小的句柄? QSizeGrip 相关吗?

c++ - 在 mac 上执行 .app 时,fstream 和 qfile 不创建文件

c++ - 具有前向声明类的 QSharedDataPointer

qt - 使 float 的 QDockWidget 无法获得焦点

c++ - 如何使用介子在 C++ 中执行代码覆盖?

c++ - 剥离 OLE header 信息 (MS Access/SQL Server)

c++ - Mac/iOS收不到UDP广播包,但可以发送UDP广播包

c++ - 在 C 中使用 printf 等效于 C++ std::setprecision(20)

c++ - 在构造函数中迭代 QTableWidget 单元格?