c++ - 如何将指针从 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;
};
我能想到的一个选择是map
在Processor
其中跟踪分配,并有一个功能RemoveFoo
,Bar
但我想知道是否还有其他方法。
解决方案
一种方法是使用std::shared_ptr
and 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
原始指针,但从一开始就出错了,所以我删除了它。
推荐阅读
- javascript - 附加值后如何在 Microsoft Edge 中读取 FormData
- batch-file - 如何避免批量等号拆分
- javascript - 如何在golang中顺序处理并发请求?
- c# - 如何获取特定类型的基本类型
- ios - 手动将 GoogleTagManager 更新到 7.1.1 后崩溃
- python-3.x - 将 Jupyter 笔记本转换为 MS Word 文档 .doc?
- php - 内容(); 不在自定义模板中工作
- wordpress - 为什么我的 wordpress 网站速度很慢并且加载时间很长?
- docker - Is there a well maintained docker image with gcloud installed in it?
- junit - 缺少的步骤 - Junit - Cucumber