这是一些 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);
我错过了什么?
最佳答案
这是未定义的行为,所以当您遇到它们时,您不能指望任何逻辑上合理或一致的行为。
但是实际上,您可以通过将指针设置为 nullptr
或 NULL
来提高运行时系统检测到此类错误的机会。
QTreeWidgetItem *rootItem = nullptr;
在 Debug模式下运行您的程序也可能有所帮助,许多现代编译器在检测到这些时会发出诊断和警告(您应该始终启用它们,将它们设置为最高、最偏执的级别)。
但请注意,以上内容并不能保证任何事情,您仍然需要编写正确且行为良好的代码。
这里又出现了过多的建议,让你使用普通对象(堆栈分配的、非指针指向的对象),或者如果你不能(比如,如果你可怜的图书馆对它们过敏 [1]),始终使用指针包装器,例如 std::unique_ptr
或 std::shared_ptr
,或者您的库提供并能够消化的东西.
[1] 我不喜欢那些类型的库。
关于c++ - 未初始化的指针就像已初始化一样工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20066503/