enable_shared_from_this
在 member function 裡拿到自己的 shared_ptr / weak_ptr。
錯誤做法
std::shared_ptr<Foo>(this) 會建立另一組 control block → 同一物件被 delete 兩次。
用法
public繼承std::enable_shared_from_this<T>- 呼叫
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_;
};