【问题标题】:copy constructor for queue seg fault队列段错误的复制构造函数
【发布时间】:2026-01-16 16:30:01
【问题描述】:

我需要为队列类做复制构造函数。 这是我的代码。我不知道为什么我有一个段错误!

Queue::Queue()
{
  front = NULL;
  rear = NULL;
  numItems = 0 ;
}

// Copy constructor                                                                                                                                                                
Queue::Queue(const Queue& queueToCopy)
{
  //QueueNode *newNode;//pointer to a new node                                                                                                                                       
  QueueNode *nodePtr;//traverse pointer                                                                                                                                            

  newNode = new QueueNode;
  nodePtr = queueToCopy.front;
  while (nodePtr != NULL){
    enqueue(nodeNode->value);
    nodePtr = nodePtr->next;
  }
}

//////////////////////// 这是我测试复制构造函数时的主要功能

int main()
{
  Queue obj; 
  //enqueue....
  ...
  // Testing Queue copy constructor                                                                                                                           
  Queue objQ2(objQ);
  cout << "The values in the queue objQ2 were: \n";
  while (!objQ2.isEmpty()){
  int value;
  objQ2.dequeue(value);
  cout << value << endl;
  }
}

【问题讨论】:

  • newNode 是如何在循环中改变的?
  • newNode-&gt;value 可能未初始化使用
  • 如果没有看到Queue 类的声明,真的很难说正确的代码应该是什么。
  • 为什么这个 codedump + “为什么 xxx 发生了” 得到了投票?!这是一个基本问题,可以通过调试器和一些语言的工作知识来解决
  • @redFIVE:嘿,乖点!我是新来的。还不知道如何使用调试器。

标签: c++ constructor copy queue


【解决方案1】:

我不确定你想用newNode 做什么,但你的循环条件似乎是错误的,因为newNode 在循环中似乎永远不会改变。正如@RSaha 的评论,可能不需要newNode,所以:

while (nodePtr != NULL){
  enqueue(nodePtr->value);
  nodePtr = nodePtr->next;
}

【讨论】:

  • enqueue(nodePtr-&gt;value);?
  • 谢谢我改成 (nodePtr != NULl) 但是当我在 main 中调用它时仍然出现 seg 错误
  • @RSahu 那么newNode 在这里做什么呢?
  • @user3923936 看到RSahu的评论,再试一次?
  • @user3923936 ,首先,研究导致段错误的原因,然后使用调试器单步执行代码。
【解决方案2】:

在我看来,newNode 永远不能为空,因此循环一直持续到 nodePtr = 0,在这种情况下,它的下一个无效。 newNode->value 也需要初始化。

也许改成 while(nodePtr != NULL)

【讨论】: