【发布时间】:2023-04-01 18:35:01
【问题描述】:
我目前正在考虑借助 unique_ptrs 实现单链表。尽管由于析构函数的递归调用可能导致堆栈溢出问题(请参阅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, 运算符=
将所有权从 r 转移到 *this,就好像通过调用 reset(r.release()) 后跟从 std::forward 分配 get_deleter() (r.get_deleter())
仔细查看 unique_ptr::reset (http://en.cppreference.com/w/cpp/memory/unique_ptr/reset),它显示
给定 current_ptr,由 *this 管理的指针执行
按照以下顺序执行以下操作:
保存当前指针 old_ptr = current_ptr 的副本
用参数 current_ptr = ptr 覆盖当前指针
如果旧指针非空,则删除之前管理的对象 if(old_ptr != nullptr) get_deleter()(old_ptr)
这意味着在这种情况下调用 r.get_deleter() 将引用一个已经被销毁的对象,还是我在这里弄错了?
非常感谢您的回复。
【问题讨论】:
标签: c++ linked-list undefined-behavior unique-ptr