C++ 链表深度复制构造函数

C++ 链表深度复制构造函数,c++,c++11,linked-list,C++,C++11,Linked List,我正在实现一个链表类的复制构造函数,它将生成一个深度复制。这是我的代码: List( const List & rhs ) { Node* rhsFront = rhs.header->next; Node* prev = header; while (rhsFront) { prev->next = new Node(rhsFront->data, nullptr); rh

我正在实现一个链表类的复制构造函数,它将生成一个深度复制。这是我的代码:

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->next是一个随机指针(很可能类似于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;
    }
}
我猜那里的头没有初始化,因此导致prev->next是一个随机指针(很可能类似于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;
    }
}

为什么你从下一个开始而不是头球。 节点*prev=标题;标题在哪里定义?您已经分配了所需的内存了吗?取而代之的是从页眉开始复制

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的线索。

为什么从下一个开始而不是从标题开始。 节点*prev=标题;标题在哪里定义?您已经分配了所需的内存了吗?取而代之的是从页眉开始复制

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的线索。

您出错了,未能在复制构造函数中初始化类成员,导致未初始化的指针取消引用和未定义的行为。通常,如果您的类有一个有效的
insert()
append()
函数,则可以通过将深度复制构造函数委托给默认的复制构造函数、迭代要复制的列表中的值,然后使用现有的类方法初始化复制到列表来实现深度复制构造函数。这是实现复制构造函数的一种完全错误的方法。您的错误在于未能初始化复制构造函数中的类成员,从而导致未初始化的指针取消引用和未定义的行为。通常,如果您的类有一个有效的
insert()
append()
函数,则可以通过将深度复制构造函数委托给默认的复制构造函数、迭代要复制的列表中的值,然后使用现有的类方法初始化复制到列表来实现深度复制构造函数。这是实现复制构造函数的一种完全错误的方法。