List类实现带指针的内存分配错误

时间:2013-10-15 05:59:31

标签: c++ memory-management linked-list erase

所以我尝试执行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()。我无法找出内存分配出错的地方。是否有任何想法可能指向我正确的方向。

1 个答案:

答案 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(据我可以从您的实现中猜测)。

希望这有帮助。