_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)错误

来源:互联网 发布:mysql offset 效率 编辑:程序博客网 时间:2024/05/29 18:33

#include "stdafx.h"#include <iostream>using namespace std;int _tmain(int argc, _TCHAR* argv[]){double *p3 = new double [3];p3[0] = 0.2;p3[1] = 0.5;p3[2] = 0.8;cout << "p3[1] is " << p3[1] << endl;p3 = p3 + 1;cout << "p3[1] is " << p3[1] << endl;//p3 = p3 - 1;delete [] p3;cin.get();return 0;}

这段代码是C++ primer plus上的,以为这个代码段很简单,照着敲后,运行没问题,突发奇想,把p3 = p3 -1 注释掉后,运行直接报_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)错误,查找了下资料,得出如下结论:

当试图删除一片连续内存块中的特定对象时,会出现上面的Assertion Failed!连续内存区域只能对该块内存的起始地址进行删除!如:

int *p = new int[5];
delete (p + 2);  // 试图删除第3个int对象,错误
delete[] p;

所以,如果在一个函数中生成对象,而在其他函数中使用并删除时,需要将该内存区域的起始地址保存起来,可以保存到全局变量、或Window对象中(如SetWindowLong(hwnd, GWL_USERDATA, (LONG) youdata))等。如果想删除该内存区域,先将该内存区域的首地址取出来再删之!


心得: 再简单的程序都要手动敲一遍,说不定就会发现知识漏洞,代码是敲出来的

0 0
原创粉丝点击