1

因此,我尝试执行 List 类的实现,但是在尝试执行擦除功能时,我不断得到一个被释放的指针未分配错误。

这是我的函数擦除()的代码:

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()。我一直无法找出内存分配出错的地方。是否有任何可能为我指明正确方向的想法。

4

1 回答 1

0

根据您的实现,您将在 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(据我从您的实现中猜到)。

希望这可以帮助。

于 2013-10-15T06:24:33.690 回答