求高人解惑,创建指针时new和不new到底有什么区别
本人已知道new的意思就是在堆空间创建一块内存并返回内存地址给指针,比如
int* p = new int;
本人理解的意思就是创建一个可以读取4字节大小的指针p,然后在堆空间开辟一个4字节大小的内存空间,并把首地址返回给指针p。并且在代码块结束之前要用delete释放指针所指向的堆空间。
而 int* p; 的意思就是创建一个可以读取4字节大小的指针p,但是指针的值(也就是地址)不确定,可以是任何值,这就是传说中的野指针。
那么问题来了,int* p;到底有没有在堆空间开辟一个4字节大小的内存空间呢?在代码块结束之前要不要用delete释放指针所指向的内存空间?
请看如下代码:
struct Data{
int x = 10;
int y() { return 10; }
};
int main()
{
Data* p; // 不用 new 创建指针
cout<<p->x<<endl; //程序无响应
cout<<p->y()<<endl; //程序能正常输出10
return 0;
}
看到这样的输出结果,本人非常困惑,为什么一个无响应一个却能正常输出。不用new创建指针不是应该指针的值不确定吗,既然指针的值是不确定为什么能精确的输出Data代码块里包含的函数?
更有意思的来了,本人把代码改成这样:
struct Data{
int x = 10;
int y() { return 10; }
};
int main()
{
Data* p = NULL; // 创建空指针
cout<<p->x<<endl; //程序无响应
cout<<p->y()<<endl; //程序能正常输出10
return 0;
}
结果还是一样,空指针都能正常输出代码块Data包含的函数,空指针不是不指向任何内存地址吗,那它是如何找到代码块的函数并执行的?
求高人解惑!!