Invalid Address specified to RtlValidateHeap调试中的对内存问题

wj_yhl 2009-04-22 06:09:41
	//按逆时针算出每个单元包含的节点坐标与编号矩阵
for(int c=1;c<=lay;c++)
{
int m=2*c+1; //第c层第一部分的节点总数
int l=2*c-1; //第c层第一部分的单元总数(三角形数)
NodeStruct * jn=new NodeStruct[m+1];
if(jn==NULL)
{
int tttt;
tttt++;
}
for(int ii=1;ii<=8;ii++)
{

if(ii<=7) //1-7部分算法相同,第8部分节点坐标计算有所不同,单独计算
{
for(int j=1;j<=m;j++) //第c层1部分的局部节点编号j
{
if(j%2==1) //局部节点为奇数,对应总节点编号zn
NodeIndex=1+8*c*(c-1)/2+c*ii-(c-1)+(j-1)/2;
if(j%2==0) //局部节点为偶数,对应总节点编号zn
{
if(c==1) //c=1时,偶数局部节点只有原点
NodeIndex=1;
else
NodeIndex=1+8*(c-1)*(c-2)/2+(c-1)*ii-(c-2)+(j/2-1);
}
jn[j].x=myNode[NodeIndex].x; //节点坐标赋给单个单元局部节点坐标矩阵jn
jn[j].y=myNode[NodeIndex].y;
jn[j].index=NodeIndex;
}
}
if(ii==8) //第8部分,最后两节点单独计算j==m-1和j==m
{
for(int j=1;j<=m;j++)
{
if(j<=(m-2))
{
if(j%2==1)
NodeIndex=1+8*c*(c-1)/2+c*ii-(c-1)+(j-1)/2;
if(j%2==0)
{
if(c==1)
NodeIndex=1;
else
NodeIndex=1+8*(c-1)*(c-2)/2+(c-1)*ii-(c-2)+(j/2-1);
}
}
if(j==(m-1))
{
if(c==1)
NodeIndex=1;
else
NodeIndex=1+8*(c-1)*(c-2)/2+(c-1)*1-(c-2)+(2/2-1);
}
if(j==m)
NodeIndex=1+8*c*(c-1)/2+c*1-(c-1)+(1-1)/2;
jn[j].x=myNode[NodeIndex].x; //节点坐标赋给单个单元局部节点坐标矩阵jn
jn[j].y=myNode[NodeIndex].y;
jn[j].index=NodeIndex;
}
}

for(int k=1;k<=l;k++) //取遍1部分所有的三角形单元
{
TrigIndex++;
myTrig[TrigIndex].Point[1]=jn[k];
myTrig[TrigIndex].Point[2]=jn[k+1];
myTrig[TrigIndex].Point[3]=jn[k+2];
}

}
if(jn==NULL)
{
int tmp=1;
tmp++;
}
[code=C/C++]
delete[]jn;
if(jn==NULL)
{
int tmp=1;
tmp++;
}
}[/code]

当c运行到4,ii运行到7时发生错误,Invalid Address specified to RtlValidateHeap( 00030000, 00038A70 )
难道delete没有正确释放内存,我查看过delete后的指针,并不是NULL啊?怎么回事呢?
...全文
1448 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
wj_yhl 2009-04-23
  • 打赏
  • 举报
回复
问题解决了,晕倒啊,我把这段代码单独复制出来调试,发现是的确由于TrigIndex越界导致的,主要的问题出在total_elenum=8*(lay^2),改为total_elenum=8*lay*lay以后就好了,非常感谢大家的关注,通过本次的调试对这个错误算是理解的很透彻了唉!!!!帖子多加100分,回馈给大家了,没想到时这么一个不起眼的原因啊,看来以后代码移植的时候要注意啊!还有个问题要注意就是jn是一个函数,在math.h中是有定义的,所以我的指针变量定义的也不怎么恰当,看来以后要多多学习了。。。
野男孩 2009-04-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wj_yhl 的回复:]
回复楼上的:myNode的索引NodeIndex没有越界,经过我的调试,发现的确是在c=4,ii=9时的那个delete的地方释放内存出错
[/Quote]

那就在myTrig[TrigIndex]的前面加上断言吧,myTrig定义的最大是多少个?比如是128,那就ASSERT(TrigIndex<128); 确保TrigIndex没有越界。

或者把这三行注释掉,然后运行看看。

//myTrig[TrigIndex].Point[1]=jn[k];
//myTrig[TrigIndex].Point[2]=jn[k+1];
//myTrig[TrigIndex].Point[3]=jn[k+2];


delete释放出错多半是因为已经被释放过,或者堆的管理信息被无意中修改了。
cnzdgs 2009-04-22
  • 打赏
  • 举报
回复
你这样调试看看,在分配jn之后,开一个内存窗口监视jn-0x20 ~ jn之间的内存,继续调试程序,这段内存是不是在哪里被改动了。
wj_yhl 2009-04-22
  • 打赏
  • 举报
回复
回复楼上的:程序只是一个简单的对话框啊,然后也没什么,就是执行到delete的时候出错,具体看9楼的描述
cnzdgs 2009-04-22
  • 打赏
  • 举报
回复
注意一下myNode和myTrig是否越界,可以借助越界检查工具来检查。另外,程序是不是多线程?
wj_yhl 2009-04-22
  • 打赏
  • 举报
回复
而且如果是const的话,后面还会出现D:\MyWork\ERT_Draw\DrawGrid.cpp(186) : error C2665: 'delete' : none of the 3 overloads can convert parameter 1 from type 'const struct NodeStruct *'
wj_yhl 2009-04-22
  • 打赏
  • 举报
回复
回复mynamelj :
(jn+j)->x=myNode[NodeIndex].x; //节点坐标赋给单个单元局部节点坐标矩阵jn
(jn+j)->y=myNode[NodeIndex].y;
(jn+j)->index=NodeIndex;

这是我的赋值方式,但是依然会提示错误啊!可是我并没有改变指针啊?
wj_yhl 2009-04-22
  • 打赏
  • 举报
回复
如果
if(c!=4)
delete[]jn;

那么调试就会提示stack overflow了,会不会是delete没有正确释放内存呢?
这个类是我自定义的一个类啊,继承于CStatic
mynamelj 2009-04-22
  • 打赏
  • 举报
回复
方法1:NodeStruct* const jn = new NodeStruct[m+1];不行,因为我后面要给这个数组赋值的,会出错
----------------------------
这样修饰只是防止你改变指针的地址,并不会防碍你修改指针指向的值.

jn[0] = aaa; 这样给它赋值是没有问题!



如你所说的那样的话结果就出来了,既然你要改变指针的地址,那么删除的时候肯定会报错.

wj_yhl 2009-04-22
  • 打赏
  • 举报
回复
回复楼上的:myNode的索引NodeIndex没有越界,经过我的调试,发现的确是在c=4,ii=9时的那个delete的地方释放内存出错
野男孩 2009-04-22
  • 打赏
  • 举报
回复
注意myNode的索引NodeIndex是否越界。这个是计算结果,看是否与预期的大小符合。
wj_yhl 2009-04-22
  • 打赏
  • 举报
回复
会是野指针的问题吗?循环执行到第四次才出现问题的啊!如果是野指针的话,应该第一次就会出问题吧!
wj_yhl 2009-04-22
  • 打赏
  • 举报
回复
方法1:NodeStruct* const jn = new NodeStruct[m+1];不行,因为我后面要给这个数组赋值的,会出错
方法2:另外delete后将jn = NULL;防止它成为野指针:也不行,问题依旧啊~~~

我觉得是不是堆内存满了呢?
oyljerry 2009-04-22
  • 打赏
  • 举报
回复
看是否有指针越界等,然后多打印一些信息出来帮助你定位问题...
Ryanwen 2009-04-22
  • 打赏
  • 举报
回复
同意楼上的说法,以前也遇到过,程序中有野指针
mynamelj 2009-04-22
  • 打赏
  • 举报
回复
另外delete后将jn = NULL;防止它成为野指针
mynamelj 2009-04-22
  • 打赏
  • 举报
回复
可能是指针地址发生了变化,建议在定义jn的时候加个const修饰看看

NodeStruct* const jn = new NodeStruct[m+1];
wj_yhl 2009-04-22
  • 打赏
  • 举报
回复
难道mfc中的delete和标准的C++中不同吗????头大中.....

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧