求高人解惑,创建指针时new和不new到底有什么区别

kkil001 2017-02-05 10:51:18
本人已知道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包含的函数,空指针不是不指向任何内存地址吗,那它是如何找到代码块的函数并执行的?

求高人解惑!!
...全文
1589 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
LG_Alex 2020-03-23
  • 打赏
  • 举报
回复
不能直接在结构体里赋值吧,你那步没响应的原因
bug狂人 2018-04-05
  • 打赏
  • 举报
回复
第一个指向的不是地址,所以程序报错,第二个指向的是地址并且被指向的地址存储的数据是10。你需要理解什么是指针,看我的博客,一幅图让你解惑。
fesdobat 2017-02-05
  • 打赏
  • 举报
回复
我觉得你需要知道用一个类指针调用函数时到底发生了什么, p->fun(); 我记得《深入c++对象模型》大概有讲。
flying_music 2017-02-05
  • 打赏
  • 举报
回复 3
int* p;到底有没有在堆空间开辟一个4字节大小的内存空间呢?
没有,这是在栈内定义的一个指针,所以是在栈内开辟了一个4字节大小的内存空间(用来放指针变量了),与此对应的,int* p = new int;是在栈上开辟了4个字节放指针,又在堆上开辟了4个字节(准备)放int变量
下面那个问题跟上面这个问题其实没关系,不要把他们联系在一起
之所以会调用成功,是因为利用指针调用类的成员函数时,只跟指针的类型有关,而与其所指内容无关,也就是说只要指针类型是这个类的指针,那就可以用它来调用这个类的成员函数。如果这个函数做的事情根类对象无关,就像你只返回一个常数,那这个函数看起来是正常运行的,但如果在类里访问了类的成员变量(比如返回x),那就会出错,因为此时要根据指针所指的内容去访问对应的成员变量,而指针实际上没有指向正确的地方,所以会出现内存访问错误
www_adintr_com 2017-02-05
  • 打赏
  • 举报
回复
成员函数和普通函数没有本质什么区别, 都是直接调用函数的, 只是比普通函数多了一个 this 指针而已. 如果你的成员函数里面没有使用这个 this 指针(也就是没有使用任何成员变量), 那么 this 指针的值为多少就无所谓了, 不管他是随机值或是 NULL. 只用通过指针调用虚函数才会通过对象的虚函数表去查找函数的地址, 这时指针无效就会出问题了
caiwei_cs 2017-02-05
  • 打赏
  • 举报
回复
我觉得这个和编译器有关系吧。 如果在其他环境编译器,如嵌入式,应该就不一样。

64,681

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧