我应该使用智能指针吗?

时间:2012-07-02 09:40:26

标签: c++ pointers c++11 smart-pointers

我有一个如下课程:

class node
{
public:

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

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

3 个答案:

答案 0 :(得分:16)

在您拥有资源(内存,文件等)的任何地方始终使用智能指针。手动拥有它们极其容易出错,并且违反许多良好做法,例如DRY

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

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

还有值得注意的是地球上的什么,指针的链接列表?这是没有意义的。为什么不是一个链接的值列表?

答案 1 :(得分:5)

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

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

这就是为什么首先有weak_ptr的原因。请注意,他们不是那么聪明地检测循环,你必须手动完成它,并使用weak_ptr来打破它们。

答案 2 :(得分:-2)

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