gpt4 book ai didi

c++ - unique_ptr : linked list entry deletion

转载 作者:可可西里 更新时间:2023-11-01 18:37:33 24 4
gpt4 key购买 nike

我目前正在考虑借助unique_ptr实现单链表。尽管由于析构函数的递归调用(请参阅 Stack overflow with unique_ptr linked list )可能会出现堆栈溢出的问题,但我还是遇到了以下问题:假设,我们有以下链表的实现

struct node {
node (void) : val(0), next(nullptr) {}
int val;
std::unique_ptr<node> next;
};

并且我们已经根据

初始化了我们的列表
int main (int argc, char* argv[]) {
node HEAD;
HEAD.val = 0;
auto ptr = &HEAD;
for (int i = 0; i < 10; ++i) {
ptr->val = i;
ptr->next.reset(new node);
ptr = ptr->next.get();
}
ptr->val = 10;
...

现在,我想删除值为 1 的节点:

ptr = &HEAD;
ptr = ptr->next.get();
HEAD.next = std::move(ptr->next);

乍一看,这似乎很合理。不过,我不确定它是否会导致未定义的行为:

根据 http://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 (r.get_deleter())

仔细查看 unique_ptr::reset ( http://en.cppreference.com/w/cpp/memory/unique_ptr/reset ),它显示

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 != nullptr) get_deleter()(old_ptr)

这意味着在这种情况下 r.get_deleter() 的调用将引用一个已经被销毁的对象,还是我弄错了?

非常感谢您的回复。

最佳答案

你的担忧对我来说似乎是有道理的。 ptr->next.get_deleter() 不再存在,因为 ptr->next*ptr 一起被销毁(虽然不再拥有任何东西)什么时候ptr被重置。在大多数情况下,这可能无关紧要,因为删除器将是一个空的基类,并且赋值将是一个空操作,但在技术上仍然是未定义的行为。

我会选择 HEAD.next.reset(ptr->next.release());明确地(如果你不关心删除器),或者 HEAD.next = std::unique_ptr<node>(std::move(ptr->next))如果您担心保留删除器。

关于c++ - unique_ptr : linked list entry deletion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40936588/

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