我在链表实现中使用std :: shared_ptr和std :: unique_ptr做错了什么?

时间:2013-10-09 15:59:36

标签: c++ c++11 shared-ptr unique-ptr

我之前从未使用过智能指针,因此我决定尝试实现一个基本的小链表,只是为了看看它是如何工作的。下面的程序只输出列表的第一个元素,即5,然后退出。

print()函数中,while循环只迭代一次,这意味着列表只包含一个元素,即使它应该包含3个元素。

以下是代码:

#include <iostream>
#include <memory>

class list {
private:
    struct node {
        int val;
        std::shared_ptr<node> next;
        node(int _val) : val(_val), next(nullptr) {}
    };
    std::shared_ptr<node> head;

public:
    list() {
        head = nullptr;
    }

    void push_back(int val) {
        std::unique_ptr<node> new_node(new node(val));
        if(head == nullptr) {
            head = std::move(new_node);
        } else {
            std::shared_ptr<node> curr(head);
            while(curr != nullptr) {
                curr = curr->next;
            }
            curr = std::move(new_node);
        }
    }

    void print() {
        std::shared_ptr<node> curr(head);
        while(curr != nullptr) {
            std::cout << curr->val << " ";
            curr = curr->next;
        }
        std::cout << std::endl;
    }
};

int main() {
    std::unique_ptr<list> lst(new list());

    lst->push_back(5);
    lst->push_back(10);
    lst->print();

    return 0;
}

1 个答案:

答案 0 :(得分:3)

您没有正确地将节点附加到末尾。这部分代码:

while(curr != nullptr) {
    curr = curr->next;
}
curr = std::move(new_node);

应改为:

while(curr->next != nullptr) {
    curr = curr->next;
}
curr->next = std::move(new_node);