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 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。