清除链表时出现问题,seg faulting删除

时间:2013-02-21 19:54:05

标签: c++

template <typename T>
void LinkedList<T>::clear()
{
  LinkedList* p = this;
  LinkedList* q = this;
  while(p->m_next != NULL)
  {
    p = p->m_next;
    delete q;
    q = p;
  }
  return;
}

class LinkedList
{
public:
  T m_data;                  // Data to be stored
  LinkedList<T>* m_next;     // Pointer to the next element in the list
 //Continues into function declarations.
 // . . .
};

这些是我认为相关的代码片段,如果您需要,请告诉我。

问题:一旦我点击删除q

,我就会出现错误
delete q;

我插了一些

cerr << "msg" << endl;

只是为了检查。有关如何更改此代码以停止seg错误的任何想法?显然我正在删除一些我不应该删除的东西,但我无法弄清楚如何。 clear函数的要点是完全删除单个链表,除了结束的哨兵。这个while循环总是在第一次运行时出现故障。

以下是测试此代码的代码。

void test01() {

  LinkedList < int > A;

  cout << endl << endl; 
  cout << " ***************** " << endl;
  cout << " *  TEST SET #1  * " << endl;
  cout << " ***************** " << endl;


  cout << "Is the list empty? " << boolalpha << A.isEmpty() <<endl; 
  cout << A << endl;
  cout << "Size of A = " << A.size() << endl;

  //TEST : Inserting 10 numbers to a
  cout << endl << "TEST : Inserting 10 numbers to A" << endl;
  for (int k=0; k<10; k++){
        A.insert_front(k+1);
  } 
  cout << A << endl;
  cout << "Size of a = " << A.size() << endl;

  //TEST : Clearing A
  cout << endl << "TEST : Clearing A" << endl;
  A.clear();
  cout << A << endl;
  cout << "Size of A = " << A.size() << endl << endl;


  cout << "Test 01 - Done!" << endl;
} // Destructor Called Here!!

我只是将功能更改为

template <typename T>
void LinkedList<T>::clear()
{
  LinkedList* p = this;
  LinkedList* q = this;
  if(p->m_next != NULL)
  {
    p = p->m_next;
    q = q->m_next;
  }
  while(p->m_next != NULL)
  {
    q = p;
    p = p->m_next;
    delete q;
  }
  m_next = NULL;
  return;
}

立即行动。

1 个答案:

答案 0 :(得分:0)

您的问题是您在自动存储中分配LinkedList,但在其上使用delete。那是UB。

但是,您选择的设计会产生其他错误,即使我只指出了与您的段错误直接相关的错误。大多数链接列表都设计为管理节点列表的类,并且它们不会将节点类公开给客户端。我建议你遵循这个方法。