c++ - 代码因未初始化的变量而崩溃,即使我实际上并没有使用它

标签 c++ visual-studio visual-c++ visual-studio-2012 language-lawyer

为什么以下代码在 Visual Studio 2012 中运行时崩溃?

void foo(void* ptr)
{

}

int main()
{
  void* ptr;
  foo(ptr);
}

Run-Time Check Failure #3 - The variable 'ptr' is being used without being initialized.

我知道可以通过将“Basic Runtime Checks”选项设置为“Default”来禁用此错误,但是当我实际上没有取消引用指定的指针时,我看不出有任何理由会出现此错误。

这是有意的行为吗?

最佳答案

即使只是将指针传递给您正在“使用”它的函数,如果该值未初始化,这在技术上是未定义的行为。

原因是在某些硬件平台上,指针在特殊寄存器中传递,并且将它们设置为无效值会在设置寄存器时产生硬件陷阱,而不是何时以及是否指针实际使用。

解决方案不是禁用检查,而是在使用前初始化指针。如果您不知道要使用的值,那么只需使用 nullptr

关于c++ - 代码因未初始化的变量而崩溃,即使我实际上并没有使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39681190/

相关文章:

c++ - 深入研究 C++ 中的多线程编程时, "things to know"是什么

c++ - 移动 basic_iostream 时 basic_ostream 基会发生什么变化?

c++ - 如何找出 C++ 中的当前字符集?

c++ - 大型抽象基类

c++ - 应为使用 GetDIBits 函数从 HBITMAP 接收的 DIB 数据分配多少内存?

c++ - 如何使用 c++ libboost 运行进程并获取其输出?

c++ - 如何在 Eigen (C++) 中处理复数?

c# - 如何修复: Unable to connect to any of the specified MySQL ports

visual-studio - react-native run-windows 给出错误 : Certificate could not be opened: TemporaryKey. pfx 错误

visual-c++ - 获取蓝牙配对设备