在多个位置引用的对象

时间:2012-05-03 07:47:56

标签: c++ boost

我想弄清楚如何在我的程序中管理items。我希望有一个统一的inventory系统,知道每个item的位置。然后拥有container个实际拥有库存items的对象,并通过container id找到所有内容。

我的想法是将items保留在containersboost::ptr_vetors内,然后在inventory内的哈希表中保留一个指针(可能是同一个)对象,现在根据inventory改变事物是很容易的,只需更改单个值,将事物从container X移动到container Y只需从一个指针移除向量,并将其传递给另一个容器,或在一个container或其他容器中完成所有工作。

我在考虑问题时遇到的问题是什么时候把所有东西拿出去了。我真的只处理过一次将指针/对象放在一个地方而不是多个,我知道如果我尝试删除已被删除的东西,它将至少导致崩溃。首先想到的是删除containers中的所有引用,并将其保留在inventory中,然后逐步执行,并删除inventory。这是可行的,还是我没有考虑到这一点,需要重新考虑这一点?如果我只需要移除一件东西(保留其余部分)怎么办?

我担心在任何一种情况下都会对指针进行去验证。

2 个答案:

答案 0 :(得分:0)

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

  1. boost::shared_ptrstd::shared_ptr与标准向量一起使用。那样你就没有 不得不担心删除和内存被逐步释放 只要没有指针引用该对象。如果您需要经常销毁特定对象并且需要的代码量最少,这将非常有用。缺点是存储 如果大多数对象永远不会从其他对象中被破坏并且你有很多对象,那么开销很大。而且,根据您删除对象的位置,它仍然可以在没有容器的情况下驻留在库存中,反之亦然。
  2. 通过派遣或将其包装在另一个类别中,让容器负责销毁和去索引。由于每个对象的指针只出现在您描述的一个容器中,因此只有库存可能会有额外的指针。因此,无论何时要移除对象,容器都必须查找库存以移除指向它将要销毁的对象的指针。管理费用是库存的簿记。
  3. 使用内存池,该内存池是一个存储指向所有对象的指针的容器,并在销毁自身时负责销毁它们。内存池可以是boost::ptr_vector,而其他容器是标准向量。这对于频繁添加和查询系统中的对象非常有效。缺点是内存池必须比容器和库存更长。否则,如果个别物品需要与其他物品分开销毁,则必须像(2)中那样进行簿记。

答案 1 :(得分:0)

传递它时,

Boost::ptr_vector会假定对象的所有权。当您从该向量中删除对象时,它将被自动删除。您可以删除项目而不删除它们,但使用内置的auto_type(请参阅农场示例中的使用情况)。

这意味着您一次只能在一个ptr_vector中拥有一个项目。但是,您想要在ptr_vector中拥有项目,然后让ptr_vector拥有您的广告资源对象(这是另一个ptr_vector)应该有效。我从来没有这样做,但应该没问题。

要删除单个对象,只需使用container_id和item_id进行查找,然后将其从项级ptr_vector中删除。要删除容器,只需将其从清单中删除即可。它将破坏它在那时包含的任何东西。

如果要删除它们而不删除,请使用auto_type安全删除它们。您可以从auto_type释放它们,如果您想使用原始指针指向对象,请随意执行。