我对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 没有初始化指针,但这是某种“预初始化”(或其他)?
感谢!
斯拉
答案 0 :(得分:1)
删除未初始化的指针是未定义的行为。
如果您幸运的话,未定义的行为可能会导致您的程序崩溃。你运气不好,,你的程序没有崩溃。
在这种情况下,当您调用delete ptr
时,编译器知道ptr
是垃圾。也许它只是用delete
调用任何值得用的值,如果你使用cout
,nullptr
恰巧恰好是那个值。