从逆向分析角度看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中)
进入f()函数后
*********************************************************
再看<<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

