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

时间:2015-03-02 03:49:57

标签: c++ pointers initialization

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

我知道您无法删除未初始化的指针,如果您想使用删除,则应首先初始化指针。但 std :: cout 以某种方式“初始化”它吗?
如果我尝试运行下面的代码,它将在执行期间崩溃。

#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 未初始化,因为我无法为其指定任何内容,如果我在删除之前添加此行

*ptr = 5;

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

1 个答案:

答案 0 :(得分:1)

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

如果您幸运的话,未定义的行为可能会导致您的程序崩溃。你运气不好,,你的程序没有崩溃。

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