根据您的实现,您将在 while 循环的第三次迭代中释放相同的内存空间(即,如果您释放的元素超过 2 个,则可能会出现错误)。
template <class T> void List<T>::erase(ListIterator<T> & start, ListIterator<T> & stop)
{
while (start<= stop) {
ListIterator<T> * temp = &start;
Line:1 ++temp;
Line:2 delete start.currentLink;
Line:3 start.currentLink = temp->currentLink;
}
}
考虑 ListClass = {A, B, C} 与 A.link = 100, B.link = 101 和 C.link = 102
第一次迭代:
Line1:温度指向 B
Line2:你免费100
Line3: 你分配 A.link = temp.link (i,e B.link) = 101
第二次迭代:
Line1: temp 仍然指向 B
Line2:你免费101
Line3:您分配 A.link = temp.link (i,e B.link) = 101 已被释放
第三次迭代
Line1: temp 仍然指向同一个该死的 B
Line2:你释放了已经释放的 101 <--- 可能 gdb 在这里抱怨
轻松修复:
template <class T> void List<T>::erase(ListIterator<T> & start, ListIterator<T> & stop)
{
ListIterator<T> * temp = &start;
while (start<= stop) {
++temp;
delete start.currentLink;
start.currentLink = temp->currentLink;
}
}
更好的修复:
template <class T> void List<T>::erase(ListIterator<T> & start, ListIterator<T> & stop)
{
ListIterator<T> * temp = &start;
while (start<= stop) {
delete start.currentLink;
start++;
}
temp->currentLink = start.currentLink;
}
尽管我对擦除功能感到困惑,因为最后 2 个元素将具有相同的 currentLink(据我从您的实现中猜到)。
希望这可以帮助。