适当使用shared_ptr?

bbt*_*trb 8 c++ shared-ptr ownership

没有经验shared_ptr<>我想知道以下是否是一个合适的用例,以及返回shared_ptr<>给用户是否是一个好主意.

我有一个结构图,节点之间有多个连接.在遍历图形期间,为每个节点分配一个值(从连接的节点计算),并且我希望用户能够轻松地访问该值.整个事情看起来(强烈简化)像这样:

class Pool;
class Node {
    public:
        typedef std::tr1::shared_ptr<Node> Ptr;  
        ...
        void compute_dependencies() { 
            ...
            // calls Pool to get a new Node instance
            dependencies_.push_back(Pool::create_node(...));
            ...
        }

        // evaluate the current node
        void evaluate() { /* use dependencies_ */ };        
        double value() const { if(evaluated) return value_; };

    private:
        std::vector<Node::Ptr> dependencies_;            // vector<Node*> better?
        dbl value_;
}

// Pool creates and owns all nodes
class Pool {
    public:
        static const Node::Ptr create_node(...);         // create a new node
        void traverse_and_evaluate();      

    private:
        std::vector<Node::Ptr> allnodes;   // appropriately sorted to ensure 
                                           // dependencies are evaluated 
        ...
}
Run Code Online (Sandbox Code Playgroud)

并且用户调用:

Pool pool();
Node::Ptr node1 = Pool::create_node(...);
Node::Ptr node2 = Pool::create_node(...);
....
pool.traverse_and_evaluate();   
// ready to read out the now populated values
cout << node1->value() << " " << node2->value() << ... 
Run Code Online (Sandbox Code Playgroud)

这样做的好处是用户可以直接访问他关心的节点(依赖性通常是无趣的).但我不能100%肯定这是不是一个好主意.

感谢您的输入!

编辑:没有循环依赖.

Hea*_*eek 10

shared_ptr当一个物体没有一个明确的拥有者(或者可能需要比它的拥有者更长)时,它主要是有用的,所以没有明显的地方可以摧毁它.在shared_ptr本质上成为业主,并在最后一个对象被销毁shared_ptr它超出范围.

如果你有一个明确的老板,比如你的Pool班级,而且没有必要让Node对象比拥有的更长Pool,那么真的不需要了shared_ptr.你可以破坏所有者析构函数中的对象.

  • @bbtrb:返回一个`Node*`很好,但我建议改用`std :: vector <Node>`(无泄漏).如果你真的不能复制`Node`(如果它是基类)你可以使用`boost :: ptr_vector <Node>`. (3认同)