读书人

从逆向分析视角看C++拷贝构造函数

发布时间: 2013-03-12 11:19:35 作者: rapoo

从逆向分析角度看C++拷贝构造函数

一段C++代码:


Assembly Code:


解析如下:

1. 对象h调用构造函数

2. 输出字符串“Entering f()”

3. 在进入f()函数之前,创建了一个临时对象Temp,调用拷贝构造函数,将对象h的内容拷贝到Temp中

4. 进入f()函数,在执行“return x”语句后,调用拷贝构造函数,将对象Temp的内容拷贝到h2中(完成了h2 = f(h)的工作)

5. 在f()函数结束前,为Temp调用析构函数,销毁Temp对象

6. 退出f()函数,在main函数结束前,先销毁对象h2,最后销毁对象h

----------------------------------------

逆向分析时执行“HowMany h2 = f(h);”语句过程中栈分布的记录:

*****

进入f()函数前(创建了一个临时对象Temp,调用拷贝构造函数,将对象h的内容拷贝到Temp中)

从逆向分析视角看C++拷贝构造函数


进入f()函数后

从逆向分析视角看C++拷贝构造函数


*********************************************************

再看<<Thinking in C++>>中的一段代码,更为清晰的讲解了拷贝构造函数的机制:


解释如下:

1. 创建对象h,并调用构造函数

2. 输出“Entering f()”字符串

3. 进入f()函数前,创建一个临时对象Temp,并调用拷贝构造函数,将对象h的内容拷贝到Temp中

4. 进入f()函数后,在“return x”时,调用拷贝构造函数,将对象Temp的内容拷贝到h2中,在函数结束前调用析构函数,销毁对象Temp

5. 输出字符串

6.进入f()函数前,创建一个临时对象Temp,并调用拷贝构造函数,将对象h的内容拷贝到Temp中

7. 进入f()函数后,创建一个临时对象x,在“return x”时,调用拷贝构造函数,将对象Temp的内容拷贝到x中,在函数结束前调用析构函数,先销毁对象Temp,再销毁对象x

8. 在main函数结束前,调用析构函数,先销毁对象h2,再销毁对象h

读书人网 >C++

热点推荐