你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:杂志经典 / 编程语言
解析VC6.0中为类对象申请内存的过程(三)
 

再来看一下用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则没有,这是因为mallocC语言中的函数,在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;

  推荐精品文章

·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录
·2023年10月目录
·2023年9月目录 
·2023年8月目录 

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089