列出类实现 带有指针的内存分配错误

List Class implementation Memory allocation error with a pointer

本文关键字:内存 分配 错误 指针 实现      更新时间:2023-10-16

所以我试图做一个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 个元素将具有相同的当前链接(据我从您的实现中猜到)。

希望这有帮助。