我正在实现一个链表类的复制构造函数,它将进行深度复制。这是我的代码:
List( const List & rhs ) {
Node* rhsFront = rhs.header->next;
Node* prev = header;
while (rhsFront) {
prev->next = new Node(rhsFront->data, nullptr);
rhsFront = rhsFront->next;
prev = prev->next;
}
}
但是,它在这一行崩溃了:
prev->next = new Node(rhsFront->data, nullptr);
我做错了什么?
Node* prev = header;
我猜那里的头没有被初始化,因此导致prev->旁边是一个随机指针(很可能是0之类的东西),试图写到那个点会导致程序崩溃。如果是这样,这可能有效。
List( const List & rhs ) {
Node* rhsFront = rhs.header->next;
header = new Node(rhs.header->data, nullptr);
Node* prev = header;
while (rhsFront) {
prev->next = new Node(rhsFront->data, nullptr);
rhsFront = rhsFront->next;
prev = prev->next;
}
}
为什么从next开始而不是header。Node* prev = header;标头定义在哪里?您是否已经分配了所需的内存?相反,从头部开始复制。
List( const List & rhs ) {
Node* rhsFront = rhs.header;
Node* prev = header;
while (rhsFront) {
prev = new Node(rhsFront->data, rhsFront->next);
rhsFront = rhsFront->next;
prev = prev->next;
}
}
这样你就复制了所有的节点,而不是跳过标题。希望这能说得通。此外,您得到的实际异常可能会提供关于哪个访问是NPE的线索。