-1
void DLinkedList::removeName(const Elem& name) {

 DNode * node = header;

 if (node != NULL) {
     do {
         if(node->elem == name){
             node->prev->next = node->next;  
             node->next->prev = node->prev;
             delete node;
         }
         node = node->next;
     } while (node != header); // Stop when we reach the head again.
 }

}

私はそれをデバッガーに投げ込み、if(node->elem == name) を約 3 回通過した後、よくわからない理由でクラッシュしました。

4

1 に答える 1

0

条件が true の場合delete node、後で でそれを逆参照し、そこでクラッシュを引き起こしている未定義の動作node->nextを引き起こすことに注意してください

     if(node->elem == name){
         node->prev->next = node->next;  
         node->next->prev = node->prev;
         delete node; // delete here
     }
     node = node->next; // dereference invalid pointer
于 2012-12-23T19:04:42.303 に答える