仔细看一下new和delete时数组里元素的构造与析构的顺序是相逆的,接下来再来看一个示例代码片段的执行:
代码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
|