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

下面看几段代码与它们的执行结果:

   

    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时也没有调用类的析构函数;这样就验证了newdelete在为类申请内存时会调用类的构造与析构函数,而mallocfree不会。下面看看它们汇编代码是什么样一个情况。首先来看代码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类的构造函数,构造函数会再返回这个对象的起始内存地址。
  推荐精品文章

·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