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了么?编译器的行为是怎样的?