对对象使用shared_ptr

时间:2018-10-02 01:10:11

标签: c++ object shared-ptr

我有一个名为Board的结构。在此结构中,我有一个名为parentBoard的属性,该属性应该指向另一个Board对象。我本来打算使用常规指针来执行此操作,但是我在stl中为shared_pointers找到了一些东西。如果我这样定义shared_ptr:shared_ptr<Board> pointerToParentBoard;,那么如何指向已经定义的Board对象呢?

我已经尝试过了,希望它就像一个普通的指针:

pointerToNewBoard = &board1;

但是,事实并非如此,我在Google上找不到任何可以帮助的东西。任何帮助将不胜感激!

编辑:在我的项目中,内存泄漏非常昂贵,并且可能难以跟踪所有分配的内存,这就是为什么我要使用智能指针。

2 个答案:

答案 0 :(得分:0)

使父指针保持原始状态,但通过智能指针管理子指针。

struct Board
{
   private:
   std::shared_pointer<std::vector<Board>> children;
   Board * parent;
   public:
   Board(Board * ptr=nullptr):children(std::make_shared<std::vector<Board>>())
   {
        // don't add here, it becomes recursive
        parent = ptr;
   }

   // or add here
   Board addNew()
   {
       children->push_back(Board(this));
       return children->back();
   }

   // or add here
   void add(Board * ptr)
   {
       children->push_back(*ptr);
   }

   // make parent
   // should only use if "this" is a root node
   void makeParent(Board * b)
   {
       b.add(this);
       if(nullptr==parent)
           parent = b;
       else
           throw std::runtime_error("This node is not root. Can't change parent.");
   }

}

这样,当仅释放父级时,可以自动将子级独立地释放,这意味着子级的范围是其父级。

也不要忘记为三/五规则添加构造函数。

答案 1 :(得分:0)

避免在c ++中使用原始指针,以避免意外的内存泄漏。为了避免循环引用,请对父成员使用std :: weak_ptr。

struct Board
{
private:
    std::weak_ptr<Board> _parent;

public:
    Board(std::shared_ptr<Board> parent = nullptr) {
        _parent = parent;
    }

    std::shared_ptr<Board> getParent() {
        std::shared_ptr<Board> strong = std::shared_ptr<Board>(_parent);
        return strong ? strong : nullptr;
    }

    std::shared_ptr<Board> traverseToRoot() {
        std::shared_ptr<Board> grand_parent = getParent();
        std::shared_ptr<Board> parent = grand_parent;
        while (!grand_parent) {
            parent = grand_parent;
            grand_parent = grand_parent->getParent();
        }
        return parent;
    }
};

int main()
{
    std::shared_ptr<Board> greatgrandparent = make_shared <Board>();
    std::shared_ptr<Board> grandparent = make_shared <Board>(greatgrandparent);
    std::shared_ptr<Board> parent = make_shared <Board>(grandparent);
    auto great_great_grand_parent = parent->traverseToRoot();
}