所以我尝试执行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;
}
}
现在我已经测试了我的链接和listiterator类,他们工作我已经完成了其他所有工作,比如insert()和push_back()。我无法找出内存分配出错的地方。是否有任何想法可能指向我正确的方向。
答案 0 :(得分:0)
根据你的实现,你将在while循环的第三次迭代中释放相同的内存空间(i,如果你释放超过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:temp指向B
第2行:你释放100
第3行:您指定A.link = temp.link(i,e B.link)= 101
第二次迭代:
Line1:temp仍然指向B
第2行:你释放101
第3行:你指定A.link = temp.link(i,e B.link)= 101已经被释放
第3次迭代
Line1:temp仍指向同一个B
第2行:你释放了已经被释放的101&lt; ---可能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(据我可以从您的实现中猜测)。
希望这有帮助。