gpt4 book ai didi

c++ - 使用unique_ptr的链表的弹出方法

转载 作者:行者123 更新时间:2023-12-02 09:47:57 24 4
gpt4 key购买 nike

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

 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可能会发生内存泄漏,因为不再有指向它的智能指针了吗?

最佳答案

I am wondering why the temporary is needed here?


它并不是真正需要的,但是使用起来也不错。

Why couldn't you simply do head = std::move(head->next)? Is this because it will result in a memory leak?


您可以。在此示例中不会泄漏。

When head is reassigned, does unique_ptr automatically free the current memory it's pointing to?


是。但是,直到先传输新指针的所有权之后,才会对旧指针进行 delete编码。每个cppreference:
https://en.cppreference.com/w/cpp/memory/unique_ptr/operator%3D

Transfers ownership from r to *this as if by calling reset(r.release()) followed by an assignment of get_deleter() from std::forward<E>(r.get_deleter()).


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

Replaces the managed object.

  1. Given current_ptr, the pointer that was managed by *this, performs the following actions, in this order:

    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中的旧节点的指针将首先通过其move构造函数移动到 temp,将 head重置为保留 nullptr。然后 head.operator=将调用 next.release()并获取该指针。然后 temp将超出范围, delete进入旧节点。
在不使用 temp的情况下, head.operator=将调用 next.release(),保存其旧指针并用释放的指针替换它,然后 delete保存的指针。
两种方式均无泄漏。

I was under the impression that smart pointers are fool proof from memory leaks.


如果使用正确,则可以。

It seems in this case there might be a memory leak for the original head because there would no longer be a smart pointer pointing to it?


没有泄漏,因为总是有一个指向旧节点的 unique_ptr,直到 pop()退出并且 temp被销毁为止, delete将旧节点与旧节点一起使用。即使省略了 temp,在转移其 next指针的所有权后,旧节点仍会被正确销毁。

关于c++ - 使用unique_ptr的链表的弹出方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63496578/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com