这是我对智能指针的了解
对于双链表,我们有两个指针指向上一个和下一个节点。我们在实现中使用了shared_ptr和weak_ptr。为什么不使用两个weak_ptr?
答案 0 :(得分:3)
我们不使用两个weak_ptr
,因为它不起作用。
想象一个有两个节点的列表。列表头是第一个节点的非弱ptr。因此,第一个节点保持活动状态。但是什么非弱指针可以使第二个节点保持活动状态?
管理对象的生存期面临两个挑战。它们应该存活足够长的时间,但不能太长。这不仅适用于C ++或智能指针,这实际上是所有编程语言中的基本问题。通过了解您正在解决的问题,并使用您的语言为您提供的工具来表达该问题,您可以解决该问题。
答案 1 :(得分:1)
我们可以使用shared_ptr
到next
和weak_ptr
到prev
,但不能使用两个weak_ptr
。如果没有shared_ptr
指向一个节点,则引用计数将变为零,而weak_ptr
将变为nullptr
。
无论如何,对链接列表使用shared_ptr
实在是太过分了。由于节点(头或上一个节点)仅拥有一个对象,因此unique_ptr
只需一个简单的next
,并带有指向prev
的原始指针
请注意,使用智能指针存在链表风险。当长列表被销毁时,就会出现问题,而递归销毁它。节点析构函数调用智能指针的析构函数,后者调用节点析构函数。 stacj最有可能在O(n)中增长。由于列表的长度可能超过最大可能的堆栈,因此代码可能耗尽堆栈空间并崩溃。
这并不意味着不能使用智能指针,只是节点必须实现析构函数。析构函数必须在循环中擦除节点,以便不会调用递归。