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

仔细看一下newdelete时数组里元素的构造与析构的顺序是相逆的,接下来再来看一个示例代码片段的执行:

代码2

CMemoryItem* pItem = new CMemoryItem[10];

delete pItem;

执行输出:

Destructor CMemoryItem Nember[1]

然后出现一个断言失败的对话框,如图1所示。


1

单看输出的那一行就可了解大概,系统把这块内存当一个类来释放,这样必定会出错。

接下来看一下这个提示框是怎么回事。它提示_CrtIsValidHeapPointer返回失败了,那这个函数是做什么用的呢?在MDSN中可得到它的解释,它是用来验证内存指针有效性的一个功能函数。代码就两句,么刚申请的内存再释放就变成无效了呢?来看一下释放的过程吧,首先看看代码1的汇编实现,下面是主要的汇编代码版段:

00401EA8   mov         ecx,dword ptr [ebp-20h]

00401EAB   call        @ILT+165(CMemoryItem::`vector deleting destructor') (004010aa)

00401EB0   mov         dword ptr [ebp-2Ch],eax

第一句执行后通过ECX中的值探查到ECX存放着pItem指向的地址;紧接着就调用了delete[],这里列出具体的汇编代码:

004020F0   push        ebp

004020F1   mov         ebp,esp

004020F3   sub         esp,44h

004020F6   push        ebx

004020F7   push        esi

004020F8   push        edi

004020F9   push        ecx

004020FA   lea         edi,[ebp-44h]

004020FD   mov         ecx,11h

00402102   mov         eax,0CCCCCCCCh

00402107   rep stos    dword ptr [edi]

00402109   pop         ecx

0040210A   mov         dword ptr [ebp-4],ecx

0040210D   mov         eax,dword ptr [ebp+8]

00402110   and         eax,2

00402113   test        eax,eax

00402115   je          CMemoryItem::`vector deleting destructor'+5Fh (0040214f)

00402117   push        offset @ILT+160(CMemoryItem::~CMemoryItem) (004010a5)

0040211C   mov         ecx,dword ptr [ebp-4]

0040211F   mov         edx,dword ptr [ecx-4]

00402122   push        edx

  推荐精品文章

·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