下面看几段代码与它们的执行结果:
CMemoryItem* pItem = new CMemoryItem;
delete pItem;
执行输出:
Construct CMemoryItem Nember[1]
Destructor CMemoryItem Nember[1]
代码2:
CMemoryItem* pItem = (CMemoryItem*)malloc(sizeof(CMemoryItem));
free(pItem);
执行输出:
无
这时没有看到有代码1那样的输出,可见malloc时并没有去调用类的构造函数,free时也没有调用类的析构函数;这样就验证了new和delete在为类申请内存时会调用类的构造与析构函数,而malloc和free不会。下面看看它们汇编代码是什么样一个情况。首先来看代码1片段:
00401D76 push edx ;
00401D77 push offset THIS_FILE (00416690)
00401D7C push 8
00401D7E call operator new (004021c4)
00401D83 add esp,0Ch
00401D86 mov dword ptr [ebp-28h],eax
00401D89 mov dword ptr [ebp-4],0
00401D90 cmp dword ptr [ebp-28h],0
00401D94 je CTestMemAllocateDlg::OnDelete+93h (00401da3)
00401D96 mov ecx,dword ptr [ebp-28h]
00401D99 call @ILT+15(CMemoryItem::CMemoryItem) (00401014)
00401D9E mov dword ptr [ebp-38h],eax 其中edx里存放的是CMemoryItem* pItem = new CMemoryItem;这句代码在CPP文件中的行号,offset THIS_FILE (00416690)则是CPP文件的路径,8就是这个类的长度,通过对sizeof(CMemoryItem)的输出可以证实这类的长度是8,至于为什么长度会是8,在这里不做深入的讨论,接下来就是对new的一个调用。当调用完成后对调用的返回值做一是否为0的验证;紧接着就调用了CMemoryItem类的构造函数,构造函数会再返回这个对象的起始内存地址。
|