typedef struct SegmentInf{
INT nPixcels;//区域总的象素 WORD nAveGrayL;//低能平均灰度
WORD nAveGrayH;//高能平均灰度
BYTE nfRatio;//隶属度
int nEquivalentLabel;//等价对
} MySegInf;
MySegInf* m_pSegInf;A{
m_pSegInf = new MySegInf[NWIDTH];
if(m_pSegInf == NULL)
return;
ZeroMemory(m_pSegInf,NWIDTH*sizeof(SegmentInf));
}
B{
....
....
if(m_nLabel == m_nSegSize - 1)
{
MySegInf* pCopy = new MySegInf[m_nSegSize];
memcpy(pCopy,m_pSegInf,m_nLabel*sizeof(MySegInf));
m_nSegSize = m_nLabel + 10;
if(m_pSegInf != NULL)
{
delete []m_pSegInf;
m_pSegInf = NULL;
}
m_pSegInf = new MySegInf[m_nSegSize];
memcpy(m_pSegInf,pCopy,m_nLabel*sizeof(MySegInf));
ZeroMemory(m_pSegInf + m_nLabel,10 * sizeof(MySegInf));
SAFE_DEL_ARRAY(pCopy);
}
...
...}
执行到
if(m_pSegInf != NULL)
{
delete []m_pSegInf;
m_pSegInf = NULL;
}
中断,不知道什么原因?
after normal block at 0x0038bfd8(m_pSegInf的起始地址)
但是这块内存应该存在地阿
INT nPixcels;//区域总的象素 WORD nAveGrayL;//低能平均灰度
WORD nAveGrayH;//高能平均灰度
BYTE nfRatio;//隶属度
int nEquivalentLabel;//等价对
} MySegInf;
MySegInf* m_pSegInf;A{
m_pSegInf = new MySegInf[NWIDTH];
if(m_pSegInf == NULL)
return;
ZeroMemory(m_pSegInf,NWIDTH*sizeof(SegmentInf));
}
B{
....
....
if(m_nLabel == m_nSegSize - 1)
{
MySegInf* pCopy = new MySegInf[m_nSegSize];
memcpy(pCopy,m_pSegInf,m_nLabel*sizeof(MySegInf));
m_nSegSize = m_nLabel + 10;
if(m_pSegInf != NULL)
{
delete []m_pSegInf;
m_pSegInf = NULL;
}
m_pSegInf = new MySegInf[m_nSegSize];
memcpy(m_pSegInf,pCopy,m_nLabel*sizeof(MySegInf));
ZeroMemory(m_pSegInf + m_nLabel,10 * sizeof(MySegInf));
SAFE_DEL_ARRAY(pCopy);
}
...
...}
执行到
if(m_pSegInf != NULL)
{
delete []m_pSegInf;
m_pSegInf = NULL;
}
中断,不知道什么原因?
after normal block at 0x0038bfd8(m_pSegInf的起始地址)
但是这块内存应该存在地阿
{
delete []m_pSegInf;
m_pSegInf = NULL;
}
这样写是没有必要的,delete和delete[]会自动判断指针是否为空,如果是空,那么它们什么也不会干delete []m_pSegInf;
m_pSegInf = NULL;
=========>>>>>>>>>
ZeroMemory(m_pSegInf + m_nLabel,(m_nSegSize - m_nLabel) * sizeof(MySegInf));
你要确保待清0的字节数<=被清的内存区字节数....
memcpy(pCopy,m_pSegInf,m_nLabel*sizeof(MySegInf));
memcpy(m_pSegInf,pCopy,m_nLabel*sizeof(MySegInf));
m_nLabel*sizeof(MySegInf)是否大于NWIDTH*sizeof(SegmentInf)或m_nSegSize
检查
ZeroMemory(m_pSegInf + m_nLabel,10 * sizeof(MySegInf));
是否应该为:
(char*)m_pSegInfo + m_nLable ?
10 * sizeof(MySegInf) 是否大于NWIDTH*sizeof(SegmentInf)-m_nLable * sizeof(SegmentInf)你的代码乱到让人没法看了,这样的程序不出错也难
A函数用来初始化,里面少了一行m_nSegSize = NWIDTH;
B函数省略了很多代码
fireseed说的并不能解决问题,也就是说m_nlabel = m_nSegSize - 1,是数组的最大后缀,当数组不够大时这里重新分配空间,里面的memcpy,zeromemory的m_nLabel应该是m_nSegSize,但并不影响现在的问题啊,改过后还是存在问题
seu07201213(汪洋中的一片叶子)说的在问题后面,而且那里也没有问题啊
这个delete是在初始化厚的第一次执行
typedef struct SegmentInf{
INT nPixcels;//区域总的象素 WORD nAveGrayL;//低能平均灰度
WORD nAveGrayH;//高能平均灰度
BYTE nfRatio;//隶属度
int nEquivalentLabel;//等价对
} MySegInf;
MySegInf* m_pSegInf;A{
m_pSegInf = new MySegInf[NWIDTH];
if(m_pSegInf == NULL)
return;
ZeroMemory(m_pSegInf,NWIDTH*sizeof(SegmentInf));
m_nSegSize = NWIDTH
}
B{
....
....
if(m_nLabel == m_nSegSize - 1)
{
MySegInf* pCopy = new MySegInf[m_nSegSize];
memcpy(pCopy,m_pSegInf,m_nSegSize *sizeof(MySegInf));
m_nSegSize = m_nSegSize + 10;
if(m_pSegInf != NULL)
{
delete []m_pSegInf;
m_pSegInf = NULL;
}
m_pSegInf = new MySegInf[m_nSegSize];
memcpy(m_pSegInf,pCopy,m_nSegSize *sizeof(MySegInf));
ZeroMemory(m_pSegInf + m_nSegSize ,10 * sizeof(MySegInf));
SAFE_DEL_ARRAY(pCopy);
}
...
...}
m_pSegInf[*pDataRgnLabel].nPixcels++;
不要这一句,删除没问题,加上就会出错,什么原因?调试m_pSegInf地址没有改变啊
没有影响
请继续
m_pSegInf[*pDataRgnLabel].nPixcels++;
pDataRgnLabel是什么??
已经知道什么原因了,pDataRgnLabel这个值小于零的时候没能跳过这一句,产生了越界赋值
删除的时候出了问题,现在好了,谢谢大家帮忙了
结!!!!!!!!!!