c++ 调用野指针后的行为

XMan_Liu 2017-06-23 11:58:44

class A{
public:
int i;
B* b;
A(int _i)i(_i){}
void test(){
i++;
if(b)b->do_something();
}
}

int main(){
A* a = new A(1);
delete a;
a->test();
}


如果按照上述代码的意思运行的话,我发现
1.在windows + vs debug的环境下,会crash在if(b)b->do_something(); 因为b在这里被置成oxfeeefeee,这是vs的一个magic addr
2.在linux + g++ 环境下,不会crash,因为b指针是NULL,保护住了

我的问题:
1. delete只是把a指针的内存所有权剥夺了,那块内存上的数据在下次分配前应该保持不变吧,包括指针b?
2. 如果保持不变,为啥b指针变化了?windows debug环境我理解;但是linux下是被置0了么?编译器的行为是怎样的?

...全文
231 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-06-23
  • 打赏
  • 举报
回复
其实电脑开机后物理内存的每个字节中都有值且都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。
XMan_Liu 2017-06-23
  • 打赏
  • 举报
回复
非常感谢你的帮助
幻夢之葉 2017-06-23
  • 打赏
  • 举报
回复
引用 3 楼 liuxingrui4p 的回复:
[quote=引用 2 楼 jianwen0529 的回复:] linux + g++ 应该是被置为0了 delete之后数据和指针都不变 只是告诉系统我这块内存不再占用 像借了某人的U盘用了之后归还给他
既然delete之后数据和指针不变,指针为什么还被置0了?[/quote] release之下呢 总而言之访问销毁的内存还是未定义的行为,置0与否只是编译器的行为 就算编译器把那块内存全部置0也是可以的(性能损失罢了) 是我表述的问题,不变的说法确实有问题
XMan_Liu 2017-06-23
  • 打赏
  • 举报
回复
引用 2 楼 jianwen0529 的回复:
linux + g++ 应该是被置为0了 delete之后数据和指针都不变 只是告诉系统我这块内存不再占用 像借了某人的U盘用了之后归还给他
既然delete之后数据和指针不变,指针为什么还被置0了?
幻夢之葉 2017-06-23
  • 打赏
  • 举报
回复
linux + g++ 应该是被置为0了 delete之后数据和指针都不变 只是告诉系统我这块内存不再占用 像借了某人的U盘用了之后归还给他
XMan_Liu 2017-06-23
  • 打赏
  • 举报
回复
我知道不能这么写,只是想好好理解野指针的行为

65,184

社区成员

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

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