所以我试图做一个List类的实现,但是当试图做擦除功能时,我不断得到一个指针被释放没有分配错误。
这是我的函数 erase() 的代码:
template <class T> void List<T>::erase(ListIterator<T> & start, ListIterator<T> & stop)
{
while (start<= stop) {
ListIterator<T> * temp = &start;
++temp;
delete start.currentLink;
start.currentLink = temp->currentLink;
}
}
现在我已经测试了我的链接和列表类,它们可以工作,我已经完成了其他所有工作,如 insert() 和 push_back()。我无法找出内存分配出错的地方。是否有任何想法可以指出我正确的方向。
根据您的实现,您将在 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
第一次迭代:
第 1 行:温度指向 B
第2行:您免费100
第 3 行:您分配 A.link = temp.link (即 B.link) = 101
第二次迭代:
第 1 行:温度仍指向 B
2号线:你免费 101
第 3 行:您分配 A.link = temp.link (即 B.link) = 101 已经释放
第三次迭代
第 1 行:温度仍然指向相同的的 B
第 2 行:您释放了已经释放的 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 个元素将具有相同的当前链接(据我从您的实现中猜到)。
希望这有帮助。