返回信息流#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;
}
这是一条镜像帖。来源:北邮人论坛 / cpp / #80910同步于 2014/7/21
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
下面这段代码为啥linux下可以跑通
XXLL
2014/7/21镜像同步9 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
好吧,没看到。
如果引用了的话,那不可能全都跑通。只有当未初始化的变量b指向的那块内存正好能被访问的时候才能跑通,否则肯定core。
【 在 XXLL 的大作中提到: 】
: 问题是引用了数据成员
意思是没定义对象的情况下,内存中也有变量b?
【 在 gaoweiwei 的大作中提到: 】
: 好吧,没看到。
: 如果引用了的话,那不可能全都跑通。只有当未初始化的变量b指向的那块内存正好能被访问的时候才能跑通,否则肯定core。
是说即使没定义对象,对象的方法也是存在的。对象的方法就是一个函数,一段代码,调用对象方法其实就是跳转到对应代码部分并执行而已。
【 在 xiaobing307 的大作中提到: 】
: 意思是没定义对象的情况下,内存中也有变量b?
可是int b是类B的数据成员啊
【 在 jetstorm 的大作中提到: 】
: 是说即使没定义对象,对象的方法也是存在的。对象的方法就是一个函数,一段代码,调用对象方法其实就是跳转到对应代码部分并执行而已。
把你的VS调成release模式就能运行了。
在debug模式下,未初始化的指针直接被赋值0XCCCCCCCC,对应数是-858993460,访问这个地址出错
debug这个机制是为了程序出现内存越界时调试器可以捕捉断点这个异常
特殊情况使用了栈段类成员,dword ptr[eax]的值由于main初始化中+8h偏移量刚好指向了ebp地址而正好没引发崩溃,实际栈首已被破坏(该在B::get()中读写的栈段写到了main()的栈首)。