std::cout 是否初始化(或预初始化)一个指针?

Does std::cout initialize (or pre-initialize) a pointer?

我对 C++ 中的指针有疑问。

我知道你不能删除未初始化的指针,如果你想使用删除,应该先初始化指针。但是 std::cout 是不是 "initialize" 呢?
如果我尝试 运行 下面的代码会在执行过程中崩溃。

#include <iostream>
int main (){
   int *ptr;
   delete ptr;
   return 0;
}

这正是我所期望的,我对此很满意,因为指针未初始化。但是,如果我尝试 运行 下面的代码不会崩溃!

#include <iostream>
int main (){
   int *ptr;
   std::cout << ptr << std::endl; //This is the new line
   delete ptr;
   return 0;
}

我知道指针 ptr 没有被初始化,因为我不能给它分配任何东西,如果我在 delete[=33 之前添加这一行=]

*ptr = 5;

程序将按预期崩溃。 为什么,如果我在删除之前使用 std::cout 程序就不会崩溃?我知道 cout 没有初始化指针,但这是某种 "pre-initialization"(或其他)吗?
谢谢!
以斯拉

删除未初始化的指针是未定义的行为。

未定义的行为可能 使您的程序崩溃,如果您幸运的话。你不走运,你的程序没有崩溃。

在这种情况下,当您调用 delete ptr 时,编译器知道 ptr 是垃圾。也许它只是用任何方便的值调用 delete,如果你使用 coutnullptr 恰好是那个值。