首页 > 解决方案 > 如何将指针从 unique_ptr 传递到另一个对象并管理生命周期?

问题描述

我确定有解决此问题的标准方法,但我找不到。

我有一个Processor管理所有对象寿命的类。AFoo可能会Bar偶尔分配给 a。但Bar需要知道何时Foo不再可用(已被 删除Processor)。实现这一目标的正确方法是什么?

class Processor {
  private:
    vector<unique_ptr<Foo>> foos;
    vector<unique_ptr<Bar>> bars;
};

class Bar {
  public:
    void AssignFoo(Foo* foo){ cur_foo = foo; }
  private:
    Foo* cur_foo = nullptr;
};

我能想到的一个选择是mapProcessor其中跟踪分配,并有一个功能RemoveFooBar但我想知道是否还有其他方法。

标签: c++c++11

解决方案


一种方法是使用std::shared_ptrand std::weak_ptr

class Processor {
private:
    vector<std::shared_ptr<Foo>> foos;
    vector<std::unique_ptr<Bar>> bars;
};

class Bar {
public:
    void AssignFoo(const std::weak_ptr<Foo>& foo){ cur_foo = foo; }
private:
    bool FooIsValid() const {
        return !cur_foo.expired();
    }  

    std::weak_ptr<Foo> cur_foo;
};

编辑:早些时候尝试使用unique_ptr原始指针,但从一开始就出错了,所以我删除了它。


推荐阅读