Программа аварийного завершения конструктора копирования Linked List

Я не уверен в том, почему мой конструктор копирования, похоже, приводит к сбою программы, все остальные функции были в порядке в классе связанного списка. Правило 5 действительно смущает меня сейчас реализацией. Если у кого-то есть указания или указания, где я иду не так, пожалуйста, дайте мне знать, спасибо.

DList ctor:

DList() {
    //Node* front_;
    front_ = new Node(); // creating front sentinel
    //Node* back_;
    back_ = new Node(); // creating back sentinel
    //make them point to eachother
    front_->next_ = back_;
    back_->prev_ = front_;
    listSz = 0;
}

деструктор и конструктор копирования:

//destructor
~DList() {

    Node* current = front_;

    while (current != back_)
    {
            front_ = front_->next_;
            delete current;
            current = front_;
    }
}
// copy ctor
DList(const DList& rhs) {
    cout << "in ctor" << endl;
    const Node* current = rhs.front_;
    Node* temp = nullptr;
    if (current != rhs.back_)
    {
        cout << "in if" << endl;
        front_ = new Node(current->data_);
        temp = front_;
        current = current->next_;
    }
    while (current != rhs.back_)
    {
        cout << "in while" << endl;
        Node* nn = new Node(current->data_);
        temp->next_ = nn;
        temp = temp->next_;
        current = current->next_;
    }
    cout << "test";
}

главный:

int main(void) {
    DList<int> list;
    DList<int> list2;
    DList<int>::const_iterator it;

    cout << list.size() << endl;
    list.push_front(1);
    list.push_front(2);
    list2.push_back(3);
    list2.push_front(4);
    list.print();

    std::cout << endl;


    list2.print();

    DList<int> list3 = list;
    list3.print();
}

вывод перед сбоем:

0
2
1

4
3
in ctor
in if
in while
in while
test
2
1

1 ответ

Пристальный взгляд на эти три строки:

const Node* current = rhs.front_;
...
if (current != back_)
...
while (current != back_)

Указатель current использует список от другого DNode учебный класс. Но back_ является членом неинициализированного в настоящее время класса (это this->back_) и, следовательно, будет иметь неопределенное значение. Это приведет к неопределенному поведению

Я уверен, что вы имеете в виду rhs.back_ вместо.

Есть также много других проблем в том, как вы копируете другой список, например, вы никогда не инициализируете back_ в копи-конструкторе.

Другие вопросы по тегам