首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >两个共享同一个节点和析构函数的单链表,两次删除同一个内存

两个共享同一个节点和析构函数的单链表,两次删除同一个内存
EN

Stack Overflow用户
提问于 2017-04-26 15:57:38
回答 1查看 121关注 0票数 0

链表1: 3->6->9->15->30

链表2: 10->15->30

链表1和2在15处相交,并且共享相同的节点15和30。

我有两个链表,我正在搜索相交的节点,它是15。在程序结束之前,链表析构函数被调用。第一次析构函数调用释放了内存,没有任何问题。然后第二个列表尝试删除它自己的节点15。析构函数试图删除已经释放的内存,这会导致程序崩溃。我该如何解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2017-04-26 16:24:40

首先,让我指出,您的列表通常不应该包含相同的节点。如果您需要列表之间的共享对象,请将指向对象的指针或引用保存在节点中,而不是共享节点本身。

如果你必须共享节点本身,你需要的是reference counting

本质上,您要做的是跟踪指向特定对象的指针或引用的数量(在变量中),并仅在该数量变为0时才释放内存,这表明该对象不再可访问,应该被释放。

要对STL进行引用计数,可以使用shared_ptr,它从C++11开始就在STL中。

代码语言:javascript
复制
struct node
{
    node(const data_t&);
    data_t data;
    std::shared_ptr<node> next;
};

auto head1 = std::make_shared(some_data1);
auto head2 = std::make_shared(some_data2);
head1->next = std::make_shared(some_data);
head2->next = head1->next;
//note that you do NOT copy the raw pointer, you must copy the shared_ptr itself

head1.reset();  //destroys some_data1 but not some_data
head2.reset();  //destroys some_data2 and some_data
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43628179

复制
相关文章

相似问题

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