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
,如果你使用 cout
,nullptr
恰好是那个值。
我对 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
,如果你使用 cout
,nullptr
恰好是那个值。