构造函数的使用(二)

在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

从反汇编代码中可以看出,编译器没有调用对象构造函数,只是简简单单的为对象分配了一个内存空间。

posted @ 2016-11-21 21:17  浮生_如梦  阅读(268)  评论(0编辑  收藏  举报