void CMainWindow::CreateAT()
{
int b[73] = {
1,2,5,1,3,6,2,4,7,3,
8,1,6,10,2,5,7,11,3,6,
8,12,4,7,13,10,14,5,9,11,
15,6,10,12,16,7,11,13,17,8,
12,18,9,15,19,10,14,16,20,11,
15,17,21,12,16,18,22,13,17,23,
14,20,15,19,21,16,20,22,17,21,
23,18,22
};
int c[24] = {
1,2,3,3,2,3,4,4,3,2,
4,4,4,3,3,4,4,4,3,2,
3,3,3,2
};
for(int i = 0; i < 24; i++)
{
m_nNode[i].m_data = i;
m_nNode[i].m_fFlag = 0;
}
int j = 0;
for(int k = 0; k < 24; k++)
{
CNode *pOld = &m_nNode[k];
pOld->m_pPrevNode = NULL;
for(int m = 0; m < c[k]; m++)
{
CNode *pNew = new CNode;
pNew->m_data = b[j];
pNew->m_fFlag = 0;
pOld->m_pNextNode = pNew;
pNew->m_pPrevNode = pOld;
pOld = pNew;
j++;
delete pNew;
}
pOld->m_pNextNode = NULL;
delete pOld;
}
}
以上程序是实现一个邻接表的程序  错误出在最后一个delete 查过一些资料 可能是因为pOld指针的指向发生变化后导致不能删除 但是找不到合适的解决方法
各位高手帮帮忙!

解决方案 »

  1.   

    CNode   *pOld   =   &m_nNode[k]; 
    delete   pNew;
    delete   pOld; 重复删除
      

  2.   

    哦,这样啊,谢谢 
    不过现在又出现个问题 就是
    for(int   m   =   0;   m   <   c[k];   m++) 

    CNode   *pNew   =   new   CNode; 
    pNew-> m_data   =   b[j]; 
    pNew-> m_fFlag   =   0; 
    pOld-> m_pNextNode   =   pNew; 
    pNew-> m_pPrevNode   =   pOld; 
    pOld   =   pNew; 
    j++; 
    delete   pNew; 

    这个程序段中 第一次执行循环体的时候创建pNew指针没有问题 再执行这个语句
    CNode   *pNew   =   new   CNode;
    就会出现问题 就是程序忽然跳到一个汇编语言形式的窗口处 还有个提示框
    user breakpoint called from code at 0X7c921230
      

  3.   

    话说,你插入一个结点后,又马上把他删除,这是想干啥?
    而且pOld = pNew之后,又delete pNew,那pOld指向的空间已经无效了!
    说句不好听的,完全看不出有什么逻辑可言,所以更别提修改了……
      

  4.   

    可能我写的程序是不对
    我的想法是用pOld后移 通过内层循环把几个结点连起来 所以我想用pOld在循环中来指向最后一个结点 
    然后删除原来的pNew指针 重新创建一个pNew再接到pOld指向结点的后面 
    pOld   =   pNew 这一句我是想让pOld指向pNew指向的结点
    然后出来内层循环再删除pOld 再出来外层循环 重新创建pOld
      

  5.   

    我把delete语句都删除了 邻接表能建立起来了 不过还有内存泄漏问题 谢谢大家的帮忙
      

  6.   

    把两个delete全部去掉,并没有内存地址丢失,在程序退出前对m_nNode[]遍历删除节点,可以避免内存泄露
      

  7.   

    先赋null,再delete会导致内存泄露
      

  8.   

    这种情况,最好使用memcpy()拷贝的方式来赋值,而不是简单的内存指向。
    CNode   *pNew   =   new   CNode; 
    pNew-> m_data   =   b[j]; 
    pNew-> m_fFlag   =   0; 
    pOld-> m_pNextNode   =   pNew; 
    pNew-> m_pPrevNode   =   pOld; 
    pOld   =   pNew; 
    //在这个地方不能使用赋值,主要是因为内存只是一个指向的关系
    //并不知道其具体指向的内容是什么,
    j++; 
    delete   pNew; 
    另外:删除的顺序应该是先删除,再置NULL,这里的NULL只是为了防止也指针的出现。