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

在std::map中使用boost智能指针 我在最近的C++内存管理中使用智能指针来解决问题。部分原因是我使用了一系列映射将字符串绑定到一个类(称为IBlockInput),并将该类绑定到“上下文”中的当前值。我看到两种选择,但都有相同的问题:,c++,memory-management,boost,shared-ptr,stdmap,C++,Memory Management,Boost,Shared Ptr,Stdmap,选项1:类的当前值存储在类中,按上下文排序 选项2:类的当前值存储在上下文中,按类排序 这里的问题是,任何一个物体都可能先于另一个物体死亡。上下文可能在所有输入保留时被销毁,或者输入可能在上下文保留时被销毁。当一个人死了,需要为他释放资源。到目前为止,我得到的是(使用选项2): std::映射输入; std::映射输入值; 它们需要像这样分开的原因是其他类(IOutputBlocks)需要根据指针访问和设置IInputBlocks的值 关于这一点,我有几个问题: 问题1:我可以像普通映射一样访

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

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

这里的问题是,任何一个物体都可能先于另一个物体死亡。上下文可能在所有输入保留时被销毁,或者输入可能在上下文保留时被销毁。当一个人死了,需要为他释放资源。到目前为止,我得到的是(使用选项2):

std::映射输入;
std::映射输入值;
它们需要像这样分开的原因是其他类(IOutputBlocks)需要根据指针访问和设置IInputBlocks的值

关于这一点,我有几个问题:

问题1:我可以像普通映射一样访问inputValues映射,只需传入指针(而不是boost::shared_ptr/boost::weak_ptr…T*)即可访问它吗?我也可以使用弱PTR或共享PTR,如果这是实际的方法

问题2:如果需要,我使用弱指针让对象消亡(如果我在执行上面的选项1,我将不得不使用指向上下文的弱指针)。如果弱指针过期,我尝试在映射中访问它,会发生什么?它所指向的数据是否已丢失,还是仍能与原始指针一起工作

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

std::映射输入;
std::map
std::map输入值--这很糟糕。当一个
弱\u ptr
死亡时,它将与
nullptr
进行比较,并且它的顺序不被保持。您将获得未定义的行为(实际上,是无限循环和崩溃)

std::map
s中使用键时要小心

由于ABA问题,使用可能被解除分配的原始指针是不好的,其中有效指针变为无效,然后分配一个与之相等的新指针。(有
make_shared
的实现细节可以让这种事情在实践中起作用,但这是混乱和危险的)

您可能需要某种双重间接寻址,在这种情况下,您具有指向指针的等效指针。我叫他们把手。句柄过期的内部指针会导致它在映射中注销句柄,当句柄超出每个映射时,它会销毁自己。我不知道它是否会起作用,但它可能会起作用。我怀疑它需要先摆弄一下

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

但我想不出一个办法来澄清这一点

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