当我访问下一个Node指针时,c++崩溃了



我正在使用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;

什么也没发生,函数不能工作。

两个表达式不相同吗?

首先。你的最后一个代码没有任何作用。再读一遍。
这样你就永远不会检查列表的末尾,即使在循环中也是如此。
您如何知道元素已被删除?如果您的程序在这一行崩溃,则不会删除任何内容。
我没有看到任何删除,所以你永远不会删除这个对象,它仍然在内存中。
你能告诉我们确切的坠机信息吗?使用gdb也许

对于您使用的每个指针,您必须检查它是否与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

相关内容

  • 没有找到相关文章

最新更新