带有观察者指针的共享指针

时间:2017-03-28 20:02:19

标签: c++ c++11 pointers vector tree

我有一个Foo类,它有一些大类的向量。这个想法是,八进制树将以向量的元素递归地构建,并且每个OctreeNode将具有指向Foo中找到的向量的少数元素的指针。 (在示例中,为简单起见,节点将仅指向向量的一个元素)

class Foo
{
    vector<LargeClass>  mLargeClasses;

    void removeItem(const int index);    //remove an element from the vector at the index
}

class OctreeNode
{
    LargeClass* mLargeClass;
}

可以说,&#34;为什么在构建树之后保留向量,并将对象存储在树本身中#34;。是的,我们只是说,我需要保持矢量与构建的树平行。

虽然上述概念有效,但是当从底层矢量中删除元素时,我遇到了问题。在这种情况下,一些八叉树节点最终会出现悬空指针。

我的解决方案#1: 如果调用 removeItem 函数,那么在它移除向量元素之前,它首先递归遍历八进制树,并使所有 mLargeClass 指针成为nullptr,恰好指向该特定的向量元素。可以在节点中使用nullptr,因为我每次都会检查nullptr,无论如何都要访问它们。

我的解决方案#2: 让矢量存储 shared_ptrs ,并让OctreeNode存储 weak_ptr 。我不喜欢这个,因为每次我访问树中的 weak_ptr 时,它会在后台转换为 shared_ptr ,并且所有原子计数器都会增加。我不是性能测试专家,但我有一种感觉,它比使用if条件的简单指针访问慢。

有人知道更好的解决方案吗?

我认为最优雅的是: 要拥有行为类似于 shared_pointer 的智能指针,计数,有多少其他指针引用它,保留它们的记录,如果它被销毁,它会自动将所有其他指针归零。观察者&#34;引用它的指针?

1 个答案:

答案 0 :(得分:0)

虽然这个领域和目的有些不同,但我想我会试试这个端口中描述的句柄系统: Simple, efficient weak pointer that is set to NULL when target memory is deallocated 如果我失败了,我将恢复到shared_ptr / weak_ptr二人组。在同一篇文章中描述。