当我访问下一个Node指针时C ++崩溃

时间:2016-10-09 08:55:00

标签: c++ linked-list crash nodes

我正在使用Node创建一个列表容器。

这就是Node结构的样子; mFirst 是List类的私有数据成员

struct Node{
    Node(const EType & d, Node *n = nullptr) : mData(d), mNext(n) { }
    EType mData;
    Node *mNext;        
};
Node *mFirst; 

有一个函数用于从容器中删除元素。

问题发生在 temp2->mNext = temp->mNext;

该元素已删除但程序将崩溃。

我不知道造成这个问题的原因。

template <typename EType>
void Set<EType>::remove(const EType & x) {
    if (isElement(x)) {
        Node *temp = mFirst;
        Node *temp2 = nullptr;
        while(temp->mData != x) {
            temp2 = temp;
            temp = temp->mNext;
        }   
        if (temp2 == nullptr) {
            mFirst = temp->mNext;
        } else {
            temp2->mNext = temp->mNext;
        }
    }
}

如果我将该行更改为:

temp = temp->mNext;
temp2 = temp2->mNext;
temp2 = temp;

没有任何反应,该功能无效。

两个表达式都不一样吗?

2 个答案:

答案 0 :(得分:0)

对于您使用的每个指针,您必须检查它是否与0不同:您只检查tmp2,但是您也应检查tmp。

while(tmp && tmp->mData !=x)

您需要检查列表中是否找到该元素

if(tmp)
{
  if(!tmp2)
  {
    mFirst = tmp->mNext;
    delete tmp;//now it is deleted
  }
  else
  {
    tmp2->mNext = tmp->mNext;
    delete tmp;//now it is deleted
  }

创建列表时还需要注意:最后一个元素必须将mNext设置为0。

答案 1 :(得分:0)

首先。你的最后一个代码什么都不做。再读一遍。
然后,即使在循环中,也永远不会检查列表的结尾 你怎么知道该元素已被删除?如果您的程序在此行崩溃,则不会删除任何内容 而且我没有看到任何删除,因此您永远不会删除该对象,它仍然会在内存中。
你能告诉我们确切的崩溃信息吗?使用gdb可能