我正在研究使用unique_ptr
在https://solarianprogrammer.com/2019/02/22/cpp-17-implementing-singly-linked-list-smart-pointers/上实现单链接列表。我的问题涉及以下方法:
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
可能会有内存泄漏,因为将不再有指向它的智能指针。
发布于 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
替换托管对象。
current_ptr
(由*this
管理的指针)按照以下顺序执行以下操作: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
指针的所有权后,旧节点仍然被正确销毁。
https://stackoverflow.com/questions/63496578
复制相似问题