【问题标题】:Seg fault error when copying an existing pointer复制现有指针时出现 Seg 错误
【发布时间】:2020-02-26 11:49:39
【问题描述】:

这是一个类项目的链表实现,除了这个功能外,它都可以工作。我已将 seg-fault 的位置缩小到指示的行(包含在 'std::cout...' statments 中。

// Purpose: removes a section of a lists
// Parameters:    start pointer to the begining of the section to remove.
//                end pointer to the end of the section to remove.
// Preconditions: start and end are pointers to nodes in this list.
//                start precedes end in this list.
// Postconditions: elements between start and end (inclusive) are removed
//                 from the list.
template<typename T>
void LinkedList<T>::clip(LLNode<T>* start, LLNode<T>* stop)
{
  if(m_size > 2)
  {
    LLNode<T>* walker = m_head;
    LLNode<T>* hold;
    LLNode<T>* deleter;
    while(walker != start)
    {
      hold = walker;
      walker = walker -> m_next;
    }
    int i;
    //TODO: seg-fault here
    if(stop == NULL)
    {
      hold -> m_next = NULL;
    }
    else if(stop -> m_next == NULL)
    {
      hold -> m_next = NULL;
    }
    else
    {
      std::cout << "error on next line\n";
      hold -> m_next = stop -> m_next;
      std::cout << "oh... i guess it's fixed...\n";
    }
    if(hold -> m_next == NULL)
    {
      m_back = hold;
    }
    stop -> m_next = NULL;
    walker = start;
    while(walker != NULL && walker -> m_next != NULL)
    {
      hold = walker;
      walker = walker -> m_next;
      delete deleter;
      deleter = hold;
      i++;
    }
    delete walker;
    delete deleter;
    m_size -= i;
  }
  else
  {
    clear();
  }
}

输出如下:

下一行出错

分段错误(核心转储)

任何帮助将不胜感激!

【问题讨论】:

  • start 等于head 时,您不处理这种情况(那时hold 尚未初始化!)。
  • 谢谢!我没有抓住那个!但是,问题仍然存在于列表中间的开始和结束。 :/ 编辑:即使我的测试没有使用头部作为开始,它修复了它。我将发布更新的代码作为解决方案!谢谢!
  • 你不需要单独处理 stop-&gt;m_nextnullptr ,这也包括在 else 后面。你应该更喜欢 C++ keywords (nullptr) 而不是旧的(过时的?)C macros (NULL)。
  • 你可以更简单地删除:while(walker) { hold = walker; walker = walker-&gt;m_next; delete hold; ++i; } /*no deletes afterwards*/
  • if(m_size &gt;/*!*/ 2) { } else { clear(); } - 如果stopstart 的直接继任者或者 start 是第二个元素?你不想同时删除这两个元素......

标签: c++ linked-list segmentation-fault


【解决方案1】:

显然我忽略了“开始”等于头部的边缘情况。

这是完全固定的代码:

// Purpose: removes a section of a lists
// Parameters:    start pointer to the begining of the section to remove.
//                end pointer to the end of the section to remove.
// Preconditions: start and end are pointers to nodes in this list.
//                start precedes end in this list.
// Postconditions: elements between start and end (inclusive) are removed
//                 from the list.
template<typename T>
void LinkedList<T>::clip(LLNode<T>* start, LLNode<T>* stop)
{
  LLNode<T>* walker = m_head;
  LLNode<T>* deleter;
  LLNode<T>* lastNodeOnFront;
  if(m_head == start)
  {
    lastNodeOnFront = m_head;
  }
  while(walker != start)
  {
    lastNodeOnFront = walker;
    walker = walker -> m_next;
  }
  std::cout << *this;
  if(stop == m_back || stop == NULL)
  {
    lastNodeOnFront -> m_next = NULL;
  }
  else
  {
    lastNodeOnFront -> m_next = stop -> m_next;
  }
  std::cout << "before delete\n" << *this;
  walker = start;
  while(walker != lastNodeOnFront -> m_next)
  {
    deleter = walker;
    walker = walker -> m_next;
    delete deleter;
    m_size--;
  }
  return;
}

感谢阿空加瓜的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 2018-07-20
    • 2021-12-22
    • 2011-01-06
    • 1970-01-01
    • 2021-02-11
    • 2021-10-21
    相关资源
    最近更新 更多