Skip to content

enable_shared_from_this ​

在 member function 裡拿到自己的 shared_ptr / weak_ptr。

錯誤做法 ​

std::shared_ptr<Foo>(this) 會建立另一組 control block → 同一物件被 delete 兩次。

用法 ​

  1. public 繼承 std::enable_shared_from_this<T>
  2. 呼叫 shared_from_this() 或 weak_from_this()(C++17)

原理:shared_ptr 建構時偵測到這個 base,就把自己存進其中的 weak_ptr。

坑 ​

物件不是由 shared_ptr 管理時,shared_from_this() 會 throw std::bad_weak_ptr。

→ constructor 設 private,只提供 factory:

cpp
class Node : public std::enable_shared_from_this<Node> {
public:
    static std::shared_ptr<Node> create() {
        return std::shared_ptr<Node>(new Node());
    }

    void setLeft(std::shared_ptr<Node> node) {
        left_ = node;
        left_->parent_ = weak_from_this();  // parent 用 weak_ptr 避免循環
    }

private:
    Node() = default;
    std::weak_ptr<Node> parent_;
    std::shared_ptr<Node> left_;
};

參考 ​

頁面歷史

Just observe 👀