C++ 在多个位置引用的对象

C++ 在多个位置引用的对象,c++,boost,C++,Boost,我正在试图弄清楚如何管理程序中的项。我希望有一个统一的库存系统,知道每个项目在哪里。然后,拥有实际包含已清点的项目的容器对象,并且所有内容都可以通过容器id进行定位 我的想法是将项目保存在容器中保存在boost::ptr_vetors中,然后在inventory对象中的哈希表中保存一个指针(可能是同一个指针),现在根据inventory来移动东西很容易,只需更改一个值,将对象从容器X移动到容器Y只需从一个指针向量中移除,并将其传递到另一个容器,或者在一个或另一个容器中执行所有工作 我很难考虑的问

我正在试图弄清楚如何管理程序中的
项。我希望有一个统一的
库存
系统,知道每个
项目
在哪里。然后,拥有实际包含已清点的
项目的
容器
对象,并且所有内容都可以通过
容器
id进行定位

我的想法是将
项目
保存在
容器中
保存在
boost::ptr_vetors中
,然后在
inventory
对象中的哈希表中保存一个指针(可能是同一个指针),现在根据
inventory
来移动东西很容易,只需更改一个值,将对象从
容器
X移动到
容器
Y只需从一个指针向量中移除,并将其传递到另一个容器,或者在一个或另一个
容器中执行所有工作

我很难考虑的问题是什么时候把所有的东西都拿出来。我只处理过一个指针/对象一次放在一个地方,而不是放在多个地方,我知道如果我试图删除一些已经删除的东西,至少会导致崩溃。首先想到的是从
容器
中删除所有引用,并将其保留在
清单
中,然后逐步删除
清单
。这是可行的,还是我没有考虑这一权利,需要重新考虑这一点?那么,如果我只需要移除一件东西(保留其余的东西),该怎么办


在这两种情况下,我都担心取消对指针的验证。

有几种方法可以做到这一点

  • 对标准向量使用
    boost::shared_ptr
    std::shared_ptr
    。这样你就不会 必须担心删除和内存被增量释放 每当没有指针引用对象时。如果您需要频繁地销毁特定对象,并且需要最少的代码,那么这将非常有用。缺点是存储 如果大多数对象从未被破坏,除了其他对象,并且您有很多对象,则开销。而且,根据移除对象的位置,它仍然可以驻留在没有容器的资源清册中,反之亦然
  • 通过衍生或将其包装在另一类中,赋予容器销毁和从库存中分离的责任。由于每个对象的指针只出现在您描述的一个容器中,因此只有库存可能包含额外的指针。因此,每当要删除对象时,容器都必须查找清单以删除指向它要销毁的对象的指针。间接费用是存货的簿记
  • 使用一个内存池,它是一个容器,存储指向所有对象的指针,并在其自身被销毁时负责销毁这些对象。内存池可以是
    boost::ptr_向量
    ,而其他容器是标准向量。这对于在系统中频繁添加和查询对象非常有效。缺点是内存池的寿命必须超过容器和库存。否则,如果单个对象需要与其他对象分开销毁,则必须像(2)中那样进行簿记

  • Boost::ptr_vector
    在传入对象时假定对象的所有权。从该向量中删除对象时,该对象将自动删除。但是,您可以使用内置的
    auto_type
    (有关用法,请参见农场场地示例)删除项目而不删除它们

    这意味着您一次只能在一个
    ptr\u向量中拥有一个项。但是,您的想法应该是将项目置于
    ptr\u向量中,然后将
    ptr\u向量
    归库存对象所有(这是另一个ptr\u向量)。我从来没有这样做过,但应该没问题

    要删除单个对象,只需使用容器id和项目id进行查找,然后将其从项目级别
    ptr\u vector
    中删除即可。要删除容器,只需将其从库存中删除即可。它将破坏它在该点包含的任何内容


    如果要在不删除的情况下删除它们,请使用
    auto_type
    安全地删除它们。如果您想使用指向对象的原始指针,您可以将它们从
    自动类型中释放出来
    ,并按照自己的意愿执行操作。

    为什么不使用智能指针向量(在C++11或Boost中)?你不必再关心是否要删除指针了。但我不确定是否理解你的问题。。。