7

我有一个像下面这样的类:

class node
{
public:

     node* parent;
     std::list<node*> children;
};

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

4

3 回答 3

16

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

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

由于孩子不拥有他们的父母,因此原始的父母指针很好。但是,如果父母拥​​有他们的孩子,unique_ptr这里效果最好。

还值得注意的是,指针链表到底是什么?这是没有意义的。为什么不是值的链接列表?

于 2012-07-02T09:46:23.897 回答
5

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

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

这就是为什么weak_ptr首先存在的原因。请注意,它们检测循环并不那么聪明,您必须手动进行,并使用weak_ptrs 来破坏它们。

于 2012-07-02T09:44:55.113 回答
-2

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

于 2012-07-02T09:50:07.983 回答