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;
}
現在動作しています。