首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用unique_ptr实现链表的Pop方法

用unique_ptr实现链表的Pop方法
EN

Stack Overflow用户
提问于 2020-08-20 00:08:04
回答 1查看 203关注 0票数 1

我正在研究使用unique_ptrhttps://solarianprogrammer.com/2019/02/22/cpp-17-implementing-singly-linked-list-smart-pointers/上实现单链接列表。我的问题涉及以下方法:

代码语言:javascript
运行
复制
 3 struct List {
 4     List() : head{nullptr} {};
 5 
 6     // ...
 7 
 8     void pop() {
 9         if(head == nullptr) {
10             return;
11         }
12 
13         std::unique_ptr<Node> temp = std::move(head);
14         head = std::move(temp->next);
15     }
16 
17     // ...
18 };

我想知道为什么这里需要临时的?为什么你不能简单地做head = std::move(head->next)呢?这是因为它会导致内存泄漏吗?当重新分配head时,unique_ptr是否会自动释放它所指向的当前内存?

我当时的印象是,聪明的指针在内存泄漏中是愚蠢的证明。在这种情况下,原来的head可能会有内存泄漏,因为将不再有指向它的智能指针。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-20 00:36:43

,我想知道为什么这里需要临时的?

它并不是真正需要的,但它的使用也不坏。

,你为什么不能简单地做head = std::move(head->next)呢?这是因为它会导致内存泄漏吗?

你可以的。在这个例子中不会有泄漏。

重新分配head时,unique_ptr是否自动释放它所指向的当前内存?

是。但是,在先转移新指针的所有权之后,旧指针才会是delete'd。

https://en.cppreference.com/w/cpp/memory/unique_ptr/operator%3D

将所有权从r转移到*this,就像调用reset(r.release()),然后从std::forward<E>(r.get_deleter())分配get_deleter()一样。

https://en.cppreference.com/w/cpp/memory/unique_ptr/reset

替换托管对象。

  1. 给定current_ptr (由*this管理的指针)按照以下顺序执行以下操作:

代码语言:javascript
运行
复制
1. Saves a copy of the current pointer `old_ptr = current_ptr`
2. Overwrites the current pointer with the argument `current_ptr = ptr`
3. If the old pointer was non-empty, deletes the previously managed object

if(old_ptr) get_deleter()(old_ptr).

所以:

在使用temp的情况下,指向head中旧节点的指针将首先通过其移动构造函数移动到temp,重新设置head以保存nullptr。然后head.operator=将调用next.release()并获取该指针。然后temp将超出范围,delete‘作为旧节点。

在不使用temp的情况下,head.operator=将调用next.release(),保存其旧指针并将其替换为释放的指针,然后将保存的指针delete

不管是哪条路都没有泄漏。

I给人的印象是,智能指针是防止内存泄漏的愚蠢证据。

如果使用得当,是的。

,在这种情况下,可能会有一个内存泄漏的原始head,因为将不再有一个智能指针指向它?

没有泄漏,因为总是有一个unique_ptr引用旧节点,直到pop()退出和temp被销毁为止,使用它对旧节点进行delete‘处理。即使省略了temp,在转移其next指针的所有权后,旧节点仍然被正确销毁。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63496578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档