我应该使用智能指针吗?

Should I use a smart pointer?

本文关键字:指针 智能 我应该      更新时间:2023-10-16

我有一个这样的类:

class node
{
public:
     node* parent;
     std::list<node*> children;
};

我应该使用智能指针而不是原始指针吗?为什么?如果是,什么样的智能指针?

无论您拥有资源(内存、文件等),始终使用智能指针。手动拥有它们非常容易出错,并且违反了许多良好做法,例如 DRY。

使用哪一个取决于您需要的所有权语义。 unique_ptr最适合单一所有权,shared_ptr共享所有权。

由于孩子不拥有他们的父母,所以原始的父母指针是可以的。但是,如果父母拥有自己的孩子,unique_ptr在这里效果最好。

同样值得注意的是,到底是什么,一个指向的链接列表?这是没有道理的。为什么不是值的链表?

使用智能指针总是一个好主意,但要注意引用循环。

class node
{
public:
     std::weak_ptr<node> parent;
     std::list< std::shared_ptr<node> > children;
};

这就是为什么首先要有weak_ptr。请注意,它们不是那么聪明,无法检测循环,您必须手动执行此操作,并使用 weak_ptr s 来中断它们。

绝对不是。 通常的智能指针不适用于类似图形的指针结构,并应避免。 在这种情况下,你有一棵树,并且处理所有删除(和分配)都没有问题树对象本身。