再来看一下用malloc申请内存的汇编代码,以加深理解两者的区别。下面的malloc申请内存的汇编代码:
00401D2D mov esi,esp
00401D2F push 8
00401D31 call dword ptr [__imp__malloc (004176c8)]
00401D37 add esp,4
00401D3A cmp esi,esp
00401D3C call _chkesp (004021ca)
00401D41 mov dword ptr [ebp-8],eax
00401D44 mov esi,esp
00401D46 mov eax,dword ptr [ebp-8]
00401D49 push eax
00401D4A call dword ptr [__imp__free (004176cc)]
00401D50 add esp,4
00401D53 cmp esi,esp
00401D55 call _chkesp (004021ca)
可以看到这里除对堆栈做了两次校验外没有看到任何有关构造和析构函数的调用。从以上分析可以看出两者的区别就在于:用new申请类对象时编译器加入对类构造函数的调用而malloc则没有,这是因为malloc是C语言中的函数,在C语言中没有类的概念,实现时也不会为其加入对构造函数的调用,如果单步调试到00401D7E call operator new (004021c4)时,按F11进入它的内部就能看到它的内部仍然是把调用转给了malloc函数,free 和delete区别也类似是这样的。
3 new操作的过程
本节来详细看一下申请一个类对象时的构造过程和申请一个类对象数组时的构造过程以及为基本数据类型申请数组时的一些情况,并对比三者的不同;试验时用的类还是上面的CMemoryItem类。
3.1 new单个类对象的过程
3.1.1 类中有虚函数
通过前面叙述了解new一个类对象过程但并未提及它的构造过程,这里接着上面的内容解析一下单个类的构造过程。看下面的示例代码:
代码1:
CMemoryItem* pItem = new CMemoryItem;
delete pItem;
|