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的起始地址)
但是这块内存应该存在地阿

解决方案 »

  1.   

    肯定是内存写坏了,楼主一定要记得,new和delete一定要配对,一个稳定的系统应该有这样的规定:什么地方new,在什么地方delete!
      

  2.   

    if(m_pSegInf != NULL)
       {
       delete []m_pSegInf;
       m_pSegInf = NULL;
       }
    这样写是没有必要的,delete和delete[]会自动判断指针是否为空,如果是空,那么它们什么也不会干delete []m_pSegInf;
    m_pSegInf = NULL;
      

  3.   

    ZeroMemory(m_pSegInf + m_nLabel,10 * sizeof(MySegInf));???
    =========>>>>>>>>>
    ZeroMemory(m_pSegInf + m_nLabel,(m_nSegSize - m_nLabel) * sizeof(MySegInf));
    你要确保待清0的字节数<=被清的内存区字节数....
      

  4.   

    检查这两个地方:
    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)你的代码乱到让人没法看了,这样的程序不出错也难
      

  5.   

    这里说明一下:
    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);
    }
    ...
    ...}
      

  6.   

    还有一个问题sizeof(MySegInf)为什么返回的是16呢?应该是13才对呀
      

  7.   

    WORD是2个字节,BYTE是1个字节,应该是13,怎么是16呢?
      

  8.   

    错误的原因是下面省略的一句
    m_pSegInf[*pDataRgnLabel].nPixcels++;
    不要这一句,删除没问题,加上就会出错,什么原因?调试m_pSegInf地址没有改变啊
      

  9.   

    把byte改成int还是16
    没有影响
    请继续
      

  10.   

    结构体有内存边界字节对齐现象,所以是16.
    m_pSegInf[*pDataRgnLabel].nPixcels++;
    pDataRgnLabel是什么??
      

  11.   

    pDataRgnLabel是一个变量
    已经知道什么原因了,pDataRgnLabel这个值小于零的时候没能跳过这一句,产生了越界赋值
    删除的时候出了问题,现在好了,谢谢大家帮忙了
    结!!!!!!!!!!