从析构函数传递到this的共享指针

Passing out shared pointer to this from destructor

本文关键字:共享 指针 this 析构函数      更新时间:2023-10-16

我有一个对象BagOfThings,它存储了一组Thing s和一组BagOfThingsListener s,它们想知道Thing何时从已添加到的BagOfThings中添加或删除。这样的:

class Thing;
class BagOfThings;
class BagOfThingsListener {
public:
  virtual ~BagOfThingsListener() {}
  virtual void thingAdded(std::shared_ptr<BagOfThings> bag, std::shared_ptr<Thing> thing)=0;
  virtual void thingRemoved(std::shared_ptr<BagOfThings> bag, std::shared_ptr<Thing> thing)=0;
};
class BagOfThings: public enable_shared_from_this<BagOfThings> {
private:
  std::set<std::shared_ptr<Thing>> things;
  std::list<std::shared_ptr<BagOfThingsListener>> listeners;
private:
  BagOfThings() {}
public:
  static std::shared_ptr<BagOfThings> create() {
    return std::shared_ptr<BagOfThings>(new BagOfThings());
  }
  void addThing(std::shared_ptr<Thing> thing) {
    things.insert(thing);
    for (auto it=begin(listeners); it!=end(listeners); ++it) {
      (*it)->thingAdded(shared_from_this(), thing);
    }
  }
  void removeThing(std::shared_ptr<Thing> thing) {
    things.erase(thing);
    for (auto it=begin(listeners); it!=end(listeners); ++it) {
      (*it)->thingRemoved(shared_from_this(), thing);
    }
  }
  ~BagOfThings() {
    for (auto it=begin(things); it!=end(things);) {
      auto currentIt=it++;
      auto &currentThing=*currentIt;
      things.erase(currentIt);
      for (auto it2=begin(listeners); it2!=end(listeners); ++it2) {
        (*it2)->thingRemoved(shared_from_this(), currentThing);
      }
    }
  }
};

除了析构函数之外,它工作得很好,因为当所有的shared_ptr都被销毁时,不允许使用shared_from_this(),而在调用析构函数时,它们已经销毁了。在本例中,我使用了共享指针,但在我看来,从析构函数中分发this指针是有问题的——例如,有人可能会存储指针。但是在这种情况下(想要让侦听器知道删除所有元素的销毁),如果不从侦听器中删除指向调用者的指针(即thingAdded将变成void thingAdded(std::shared_ptr<Thing>)),我看不到一个明显的好方法。

任何想法?

为什么BagOfThingsListener::thingAdded和BagOfThingsListener::thingRemoved需要采取一个shared_ptr?对BagOfThings的引用/const引用还不够吗?当BagOfThings调用thingAdded或thingRemoved时,你知道this指针是有效的,因此引用也将是有效的。