在我的链表实现中,我对 std::shared_ptr 和 std::unique_ptr 做错了什么
What am I doing wrong with std::shared_ptr and std::unique_ptr in my linked list implementation?
我以前从未使用过智能指针,所以我决定尝试实现一个基本的小链表,只是为了看看它是如何工作的。程序波纹管仅输出列表的第一个元素,即 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);
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- 引用 std::shared:ptr 以避免引用计数
- C++14 unique_ptr并使用已删除的函数'std::unique-ptr' unique_ptr错误
- 使用std :: String ptr的错误打印std :: String
- C++中的大小释放:全局运算符delete的正确行为是什么(void*ptr,std::size_t size)
- std::哈希表示无序映射中的唯一 PTR
- boost::shared_ptr和std::shared-ptr的同居
- 我可以用std::shared_ptr而不是boost::shared-ptr构建boost库吗
- 正确使用std智能指针以确保ptr安全
- 如何创建 std::string 包装器,它将 ptr 保留为 std::string 和 ptr 到创建该包装器实例的
- 为什么 std::string{ "const char ptr" } 有效?
- 为什么 gcc 4.9.0 中没有定义"void operator delete(void* ptr, std::size_t size) noexcept;"?
- 在 std::map 的值中使用非 ptr 是一种很好的做法吗
- 共享 PTR - C++:std::shared_ptr<T> 和 std::shared_ptr<T const> 有什么区别?