簡體   English   中英

對對象使用shared_ptr

[英]Using a shared_ptr with objects

我有一個名為Board的結構。 在此結構中,我有一個名為parentBoard的屬性,該屬性應該指向另一個Board對象。 我本來打算使用常規指針來執行此操作,但是我在stl中為shared_pointers找到了一些東西。 如果我這樣定義shared_ptr: shared_ptr<Board> pointerToParentBoard; ,如何指出已定義的Board對象?

我已經嘗試過了,希望它就像一個普通的指針:

pointerToNewBoard = &board1;

但是,事實並非如此,我在Google上找不到任何可以幫助的東西。 任何幫助是極大的贊賞!

編輯:在我的項目中,內存泄漏非常昂貴,可能很難跟蹤所有分配的內存,這就是為什么我要使用智能指針。

保持父指針原始,但通過智能指針管理子代。

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.");
   }

}

這樣,當僅釋放父對象時,可以自動將孩子獨立地釋放,這意味着孩子的范圍是其父對象。

同樣不要忘記為三/五規則添加構造函數。

避免在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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM