适当使用shared_ptr吗?

| 没有使用ѭ0的经验,我想知道以下内容是否合适,并且将ѭ0返回给用户是否是个好主意。 我有一个像图的结构,在节点之间有多个连接。在遍历图形期间,每个节点都被分配了一个值(从连接的节点计算),我希望用户能够轻松访问该值。整个过程看起来像这样(强烈简化):
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 
        ...
}
然后用户致电:
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() << ... 
这样做的好处是,用户可以直接访问他关心的节点(依赖性通常是无趣的)。但是我不确定100%是否是个好主意。 感谢您的输入! 编辑:没有循环依赖项。     
已邀请:
shared_ptr
主要用于对象没有明确所有者(或可能需要使所有者失去生存期)的情况,因此没有明显的销毁对象的位置。
shared_ptr
本质上成为所有者,并且当最后一个
shared_ptr
超出范围时,该对象也将被销毁。 当您拥有明确的所有者(例如
Pool
类),并且不需要
Node
对象超过拥有的
Pool
时,那么确实就不需要
shared_ptr
。您可以在所有者的析构函数中销毁对象。     
我想通过weak_ptr提供对其他人的访问,您可以直接从shared_ptr <节点>构造一个weak_ptr <节点>。 用户通常会从池中检索weak_ptr,然后从weak_ptr .lock()构造一个shared_ptr 。 这会向用户传达他们没有所有权的权利,并且应注意不要将锁的维护时间延长到不必要的时间,或者至少对我来说是这样:)     

要回复问题请先登录注册