1

我有一个指向用new创建的对象的指针向量。多个线程使用各种获取/设置以安全的方式访问此向量。但是,一个线程可能会删除其中一个对象,在这种情况下,另一个线程指向该对象的指针不再有效。方法如何知道指针是否有效?选项 1 和 2 实际上似乎运作良好。我不知道他们将如何扩展。最好的方法是什么?有便携版3吗?

测试有效的指针有效性示例:

1.使用整数而不是指针。哈希 (std::map) 检查指针是否仍然有效。公共方法如下所示:

get(size_t iKey)
{
   if((it = mMap.find(iKey)) != mMap.end())
   {
       TMyType * pMyType = it->second;
       // do something with pMyType
   }
}

2.有一个shared_ptr的向量。每个线程都尝试在其weak_ptr上调用 lock() 。如果返回的 shared_ptr 为 null,我们知道有人在我们等待时删除了它。公共方法如下所示:

get(boost::weak_ptr<TMyType> pMyType)
{
    boost::shared_ptr<TMyType> pGOOD = pMyType.lock();
    if (pGOOD  != NULL)
    {
         // Do something with pGOOD
    }
} 

3.在纯原始指针上测试 null 吗?这可能吗?

get(TMyType * pMyType)
{
    if(pMyType != NULL){ //do something }
}
4

1 回答 1

2

#3 将不起作用。删除指针并将其设置为 NULL 不会影响指向同一对象的其他指针。您无法使用原始指针来检测对象是否被删除。

#1 实际上是指向指针的指针。如果您始终通过该指针访问它并能够锁定它。如果没有,如果在你成功获取它后在另一个线程中删除它会发生什么?

#2 是这种想法的标准实现,该模式在很多库中都有使用。锁定一个把手,得到一个指针。如果你得到它,使用它。如果没有,它就消失了。

于 2011-03-05T00:14:59.603 回答