在我的链表实现中,我对 std::shared_ptr 和 std::unique_ptr 做错了什么

What am I doing wrong with std::shared_ptr and std::unique_ptr in my linked list implementation?

本文关键字:std ptr 什么 错了 unique 实现 链表 我的 我对 shared      更新时间:2023-10-16

我以前从未使用过智能指针,所以我决定尝试实现一个基本的小链表,只是为了看看它是如何工作的。程序波纹管仅输出列表的第一个元素,即 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;
}

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

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

应该是:

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