繁体   English   中英

在std :: map中使用Boost智能指针

[英]Using boost smart pointers in std::map

在最新的C ++内存管理中,我一直在使用智能指针。 部分原因是,我正在使用一系列映射将字符串绑定到类(称为IBlockInput),并将该类绑定到其在“上下文”中的当前值。 我看到两个选项,但是两个都有相同的问题:

选项1 :该类的当前值存储在该类内部,按上下文排序

选项2 :该类的当前值存储在上下文中,按类排序

这里的问题是,任何一个对象都可能在另一个对象之前死亡。 可以在保留所有输入的同时销毁上下文,或者可以在保留上下文的同时销毁输入。 当一个人死亡时,需要为其释放资源。 到目前为止,我有(使用选项2):

std::map<std::string, boost::weak_ptr<IBlockInput> > inputs;
std::map<boost::weak_ptr<IBlockInput>, boost::shared_ptr<std::vector<double> > > inputValues;

它们需要像这样分开的原因是其他类(IOutputBlocks)需要根据其指针访问和设置IInputBlocks的值。

我对此有一些疑问:

问题1 :我可以像访问普通地图一样访问inputValues地图,而只是传递指针(而不是boost :: shared_ptr / boost :: weak_ptr ... T *)来访问它吗? 如果那是实际的方法,我也可以使用weak_ptrs或shared_ptrs

问题2 :我在需要时使用弱指针让对象死亡(如果我在上面的选项1中执行操作,则必须指向上下文的弱指针)。 如果弱指针到期并且我尝试在地图中访问它,会发生什么? 它指向的数据是丢失了很久还是仍可与原始指针一起使用?

问题3 :也许更好的方法是使用原始指针作为键/值,然后使用弱指针(用于实时检查排序)创建一个补充映射,如下所示:

std::map<std::string, IBlockInput*> inputs;
std::map<IBlockInput*, boost::shared_ptr<std::vector<double> > inputValues;
std::map<IBlockInput*, boost::weak_ptr<IBlockInput> > pointerCache;

然后,我可以使用pointerCache进行“实时检查”,以查看是否应该保持doubles的活动状态并以这种方式管理内存。 注意 :输入向量相对经常刷新。

建议的做法是什么? 我对提升和一般使用智能指针是个新手(在过去的几个月中,我一直在C#的帮助下工作,而不必担心这种事情)。

std::map<boost::weak_ptr<IBlockInput>, boost::shared_ptr<std::vector<double> > > inputValues; - 这不好。 weak_ptr死亡时,它将比较等于nullptr ,并且其顺序将不被维护。 您将获得未定义的行为(实际上,是无限循环和崩溃)

小心在std::map用于键的内容。

由于ABA问题,使用可能被重新分配的原始指针是不好的,因为ABA问题会导致有效指针变为无效,然后分配一个与其相等的新指针。 (正在利用make_shared实现细节来使这种事情在实践中起作用,但这很麻烦而且很危险)

您可能需要某种双重间接访问,在这种情况下,您具有与指针相同的指针。 我称它们为手柄。 句柄到期的内部指针会导致它在地图中取消注册该句柄,并且当它不在每张地图中时,它会自行销毁。 我不知道它是否会起作用,但可能会起作用。 我怀疑首先需要摆弄一些东西。

句柄将按其(外部)指针值排序,因此将保持排序。 要确定句柄是否有效,必须同时检查外部指针和内部指针的有效性(因此非空句柄对于“取消引用”可能无效)。

但是我想不出一种方法来使它变得干净。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM