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;
}
立即行动。
答案 0 :(得分:0)
您的问题是您在自动存储中分配LinkedList
,但在其上使用delete
。那是UB。
但是,您选择的设计会产生其他错误,即使我只指出了与您的段错误直接相关的错误。大多数链接列表都设计为管理节点列表的类,并且它们不会将节点类公开给客户端。我建议你遵循这个方法。