-2
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;

確認するだけです。このコードを変更してセグメンテーション違反を停止する方法についてのアイデアはありますか?どうやら私はすべきでないものを削除しているようですが、その方法がわかりません。クリア機能のポイントは、エンディングセンチネルを除いて、単一リンクリストを完全に削除することです。この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;
}

現在動作しています。

4

1 に答える 1

0

問題はLinkedList、自動ストレージに割り当てているが、それを使用deleteしていることです。それがUBです。

ただし、選択したデザインは、セグメンテーション違反に直接関連するものだけを指摘しましたが、他のエラーを引き起こします。ほとんどのリンクリストは、ノードのリストを管理するクラスとして設計されており、ノードクラスをクライアントに公開しません。その方法に従うことをお勧めします。

于 2013-02-21T20:04:30.003 に答える