Attaboy520 2021-09-27 12:23 采纳率: 100%
浏览 338
已结题

C++ delete 出现断点

main


int main() {
  LinkList<int>* a = new LinkList<int>();
  for (int i = 1; i < 100; ++i)
  {
    a->Add(i);
  }
  for (int i = 0; i < a->Size(); ++i) {
    cout << a->Get(i) << endl;
  }
  
  delete a;  //在这显示:已引发异常
  a = nullptr;
}

Link


template <class T>
struct Link {
    T data;
    struct Link* next;
    struct Link* last;
};

LinkList


template <class T>
LinkList<T>::LinkList() {
  head = new Link<T>();

  head->next = head;
  head->last = head;

  count = 0;
}

template <class T>
LinkList<T>::~LinkList() {
  while (head != nullptr) {
    Link<T>* link = head->next;
    delete head;
    head = link;
  }
}


template <class T>
bool LinkList<T>::IsEmpty() const {
  return count == 0;
}

template <class T>
int LinkList<T>::Size() const {
  return count;
}

template <class T>
T& LinkList<T>::Get(const int index) const {
  Link<T>* link = head;
  for (int i =0; i<=index; ++i)
  {
    link = link->next;
  }
  return link->data;
}

template <class T>
int LinkList<T>::IndexOf(const T& element) const {
  Link<T>* link = head;
  for (int i =0; i < count ; ++i)
  {
    link = link->next;
    if ( link->data == element )
    {
      return i;
    }
  }
  link = nullptr;
  return -1;
}

template <class T>
void LinkList<T>::Erase(const int index) {
  Link<T>* link = head;
  for (int i =0; i < index; ++i)
  {
    link = link->next;
  }
  link->next->last = link->last;
  link->last->next = link->next;
  count--;
  link = nullptr;
}

template <class T>
void LinkList<T>::Add(const T& elememt) {
  Link<T>* link = new Link<T>();
  link->data = elememt;
  link->next = head;
  link->last = head->last;
  head->last->next = link;
  head->last = link;
  link = nullptr;
  count++;
}

template <class T>
void LinkList<T>::Insert(const int index, const T& element) {
  Link<T>* link = head;
  for (int i =0; i < index; ++i)
  {
    link = link->next;
  }
  Link<T>* tmp = new Link<T>();
  tmp->data = element;

  tmp->next = link;
  tmp->last = link->last;
  link->last->next = tmp;
  link->last = tmp;

  count++;
}
  • 写回答

5条回答 默认 最新

  • 泡视界 2021-09-27 17:28
    关注

    “去掉 delete a;就可以执行” 这种思路不是正解哈,相当于你不销毁内存,而是靠进程释放销毁内存。
    你的问题不在于调用了delete a,而是在于LinkList的析构函数~LinkList写的有问题。

    因为你这写的是个循环双向链表,而在析构函数种你采用delete掉head所指节点以释放内存,所以在head指向最后一个节点时,最后一个节点的next指向你第一个删除的节点地址,这块内存释放了,其值为任意随机值,但是你的判断条件为 head != nullptr,就是这里错了。

    因为 nullptr 的值为 0,但head此时是一个任意值,不等于0满足,所以会走到循环中,对无效内存再进行一次delete。不信你可以printf("%x", nullptr); 看看是多少。
    所以判断指针为空我们一般用另一个写法。 !head。

    template <class T>
    LinkList<T>::~LinkList() {
        //while (head != nullptr) {   这句错了哈
        while (!head) {
            Link<T>* link = head->next;
            delete head;
            head = link;
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 10月5日
  • 已采纳回答 9月27日
  • 修改了问题 9月27日
  • 创建了问题 9月27日

悬赏问题

  • ¥15 linux驱动,linux应用,多线程
  • ¥20 我要一个分身加定位两个功能的安卓app
  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题
  • ¥15 目标检测项目无法读取视频
  • ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
  • ¥100 求采集电商背景音乐的方法
  • ¥15 数学建模竞赛求指导帮助