能力值:
( LV2,RANK:10 )
|
-
-
2 楼
结果确实是这样
但是这不是bug
在c/c++中
extern CTest g_Test;
并不是生成一个对象
而仅仅是一个声明,说明CTest g_Test在后面定义,注意:在这里并没有分配空间和资源
所以,没有调用构造函数,只是调用成员函数
在后面CTest g_Test;才调用构造函数
|
能力值:
( LV4,RANK:50 )
|
-
-
3 楼
问题就在这里,没有对象,如何调用非静态成员函数,调试看过来,貌似是
_initterm((void)* *, (void)* *)
0043D550 push ebp
0043D551 mov ebp,esp
0043D553 mov eax,dword ptr [pfbegin] ;这个值在开始会指向一个类似虚函数表的东东,会根据这个找到在类实例化之前的成员函数,包括全局类的构造,这个值通过堆栈里面的一个特定的值进行4字节递增遍历得到
0043D556 cmp eax,dword ptr [pfend]
0043D559 jae _initterm+25h (43D575h)
0043D55B mov ecx,dword ptr [pfbegin]
0043D55E cmp dword ptr [ecx],0
0043D561 je _initterm+1Ah (43D56Ah)
0043D563 mov edx,dword ptr [pfbegin]
0043D566 mov eax,dword ptr [edx]
0043D568 call eax
0043D56A mov ecx,dword ptr [pfbegin]
0043D56D add ecx,4
0043D570 mov dword ptr [pfbegin],ecx
0043D573 jmp _initterm+3 (43D553h)
0043D575 pop ebp
0043D576 ret
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
我对汇编不熟悉
这个问题理解还没有到汇编代码的程度
期待牛人来解答
|
能力值:
( LV4,RANK:50 )
|
-
-
5 楼
IDA里面看到:
008 push offset __xi_z
00C push offset __xi_a;这个值就是pfbegin,由编译器给你定好的值
010 call j__initterm_e;这个值就是pfend,由编译器给你定好的值
详细的编译原理参考
http://blog.csdn.net/peteryxk/archive/2005/01/31/275564.aspx
|
能力值:
( LV5,RANK:70 )
|
-
-
6 楼
因为 a,b 先于g_test申明,故先初始化.
由于你的函数是类声明时包含了实现,在VC中默认此类函数为inline,其他编译器不清楚.
所幸你没有在getvalue使用成员数据.否则,行为会不确定的.因为此时g_test还没初始化.
我觉得应该是这样
|
|
|