编程语言
首页 > 编程语言> > c – 类构造函数反汇编

c – 类构造函数反汇编

作者:互联网

在调用构造函数之后有一小部分反汇编,这没有任何意义.这里是,

.text:011A18F0 loc_11A18F0:                            ; CODE XREF: main+5Bj
.text:011A18F0                 mov     [ebp+again_obj], 0
.text:011A18FA
.text:011A18FA loc_11A18FA:                            ; CODE XREF: main+6Ej
.text:011A18FA                 mov     eax, [ebp+again_obj]
.text:011A1900                 mov     [ebp+var_104], eax
.text:011A1906                 mov     [ebp+var_4], 0FFFFFFFFh
.text:011A190D                 mov     ecx, [ebp+var_104]
.text:011A1913                 mov     [ebp+var_14], ecx
.text:011A1916                 mov     eax, [ebp+var_14]
.text:011A1919                 mov     [ebp+var_E0], eax
.text:011A191F                 mov     ecx, [ebp+var_E0]
.text:011A1925                 mov     [ebp+var_EC], ecx
.text:011A192B                 cmp     [ebp+var_EC], 0
.text:011A1932                 jz      short loc_11A1949

我不明白为什么0FFFFFFFFh被移入var_4,以及为什么很多值被移入和移出变量,这就是它在这里完成的方式.优化已经完成,我在VS2010平台上编译了源代码.

解决方法:

var_4是一个内部变量(我称之为’_state’),它跟踪构造对象的状态,以便在异常发生时展开.你看到的是VC在处理新对象时所做的常见模式.例如.

 A* pA1 = new A();

转换为这样的东西:

_state = -1;
...
A *temp_pA1 = operator new(sizeof(A));
_state = 0;
if ( temp_pA1 != NULL ) 
{
   pA1 = A::A(temp_pA1);
}
else
{
   pA1 = NULL;
}
_state = -1;
...
[unwind funclet for state == 0]
{
  A::~A(temp_pA1);
}

如您所见,在对象的内存块是新的但该对象尚未构建之后,它被设置为某个值(例如0).这样,如果构造函数中发生异常,异常处理程序将自动释放分配的内存.在构造之后它被设置为-1,这大致对应于“自动完成的东西,现在所有的内存管理都在程序员的手中”.

有关更多详细信息,请参阅here(“C异常模型实现”和“带C异常的示例程序”).

标签:c,class,disassembly,reverse-engineering
来源: https://codeday.me/bug/20190903/1796293.html