BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #80910同步于 2014/7/21
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

下面这段代码为啥linux下可以跑通

XXLL
2014/7/21镜像同步9 回复
#include <iostream> using namespace std; class B { public: void fun() { b = 100; cout << "b=" << b << endl;} private: int b; }; class A { public: B* get() { return b;} private: B* b; }; int main() { A a; a.get()->fun(); return 0; }
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
gaoweiwei机器人#1 · 2014/7/21
只要不引用类的数据成员,可以用指针0或者任意指针调用任何非虚成员函数。
XXLL机器人#2 · 2014/7/21
问题是引用了数据成员 【 在 gaoweiwei 的大作中提到: 】 : 只要不引用类的数据成员,可以用指针0或者任意指针调用任何非虚成员函数。
gaoweiwei机器人#3 · 2014/7/21
好吧,没看到。 如果引用了的话,那不可能全都跑通。只有当未初始化的变量b指向的那块内存正好能被访问的时候才能跑通,否则肯定core。 【 在 XXLL 的大作中提到: 】 : 问题是引用了数据成员
xiaobing307机器人#4 · 2014/7/21
意思是没定义对象的情况下,内存中也有变量b? 【 在 gaoweiwei 的大作中提到: 】 : 好吧,没看到。 : 如果引用了的话,那不可能全都跑通。只有当未初始化的变量b指向的那块内存正好能被访问的时候才能跑通,否则肯定core。
jetstorm机器人#5 · 2014/7/21
是说即使没定义对象,对象的方法也是存在的。对象的方法就是一个函数,一段代码,调用对象方法其实就是跳转到对应代码部分并执行而已。 【 在 xiaobing307 的大作中提到: 】 : 意思是没定义对象的情况下,内存中也有变量b?
xiaobing307机器人#6 · 2014/7/22
可是int b是类B的数据成员啊 【 在 jetstorm 的大作中提到: 】 : 是说即使没定义对象,对象的方法也是存在的。对象的方法就是一个函数,一段代码,调用对象方法其实就是跳转到对应代码部分并执行而已。
lifesider机器人#7 · 2014/7/22
构建a的时候,刚好分给B* b的随机值指向的内存可读写,于是fun()里对int b的操作就是可行的
llyzltz机器人#8 · 2014/7/22
把你的VS调成release模式就能运行了。 在debug模式下,未初始化的指针直接被赋值0XCCCCCCCC,对应数是-858993460,访问这个地址出错 debug这个机制是为了程序出现内存越界时调试器可以捕捉断点这个异常
tonyjansan机器人#9 · 2014/7/23
特殊情况使用了栈段类成员,dword ptr[eax]的值由于main初始化中+8h偏移量刚好指向了ebp地址而正好没引发崩溃,实际栈首已被破坏(该在B::get()中读写的栈段写到了main()的栈首)。