构造函数的使用(二)
在C++中,程序员可以动态分配内存。而堆内存正是我们使用C++的malloc函数、new运算符或者其他具有相同功能的函数动态分配的,下面是一个使用new操作符申请一个对象的例子
#include <stdio.h> class CDemo { public: CDemo() { m_nInt = 100; } private: int m_nInt; }; int main(void) { CDemo *pDemo = new CDemo; return 0; }
以上代码反汇编如下(只贴出重要部分):
CDemo *pDemo = new CDemo; 0040104D push 4 ;需要申请的空间大小 0040104F call operator new (004011a0) 00401054 add esp,4 00401057 mov dword ptr [ebp-18h],eax ;返回的地址 0040105A mov dword ptr [ebp-4],0 00401061 cmp dword ptr [ebp-18h],0 ;判断new操作符是否成功申请了内存空进啊 00401065 je main+54h (00401074) ;失败,跳过调用构造函数 00401067 mov ecx,dword ptr [ebp-18h] ;传入this指针 0040106A call @ILT+5(CDemo::CDemo) (0040100a) ;调用构造函数 0040106F mov dword ptr [ebp-1Ch],eax 00401072 jmp main+5Bh (0040107b) ;跳过失败 00401074 mov dword ptr [ebp-1Ch],0 ;申请空间失败 0040107B mov eax,dword ptr [ebp-1Ch] 0040107E mov dword ptr [ebp-14h],eax ;给pDemo赋值 00401081 mov dword ptr [ebp-4],0FFFFFFFFh 00401088 mov ecx,dword ptr [ebp-14h] 0040108B mov dword ptr [ebp-10h],ecx 17: 18: return 0; 0040108E xor eax,eax
根据以上反汇编代码可以得知,new操作符在申请一个对象的内存空间时,会先检查空间是否申请成功,如果没有成功申请到内存空间,是不会调用对象的构造函数的。
继续使用malloc动态分配一个对象的内存空间,来看看malloc函数与new操作符的不同之出
#include <stdio.h> #include <stdlib.h> class CDemo { public: CDemo() { m_nInt = 100; } private: int m_nInt; }; int main(void) { // CDemo *pDemo = new CDemo; CDemo *pDemo = (CDemo *)malloc(sizeof(CDemo)); return 0; }
将C++代码反汇编后如下:
18: CDemo *pDemo = (CDemo *)malloc(sizeof(CDemo)); 00401038 push 4 0040103A call malloc (00401860) 0040103F add esp,4 00401042 mov dword ptr [ebp-4],eax 19: 20: return 0; 00401045 xor eax,eax
从反汇编代码中可以看出,编译器没有调用对象构造函数,只是简简单单的为对象分配了一个内存空间。