可以将过期的weak_ptr与未初始化的weak_ptr区分开来吗?

时间:2014-11-13 16:32:26

标签: c++ c++11 weak-ptr

例如:

std::weak_ptr<int> wp1(std::make_shared<int>());
std::weak_ptr<int> wp2;

assert(PointsToValidOrExpiredObject(wp1));
assert(!PointsToValidOrExpiredObject(wp2));

这样的功能可能吗?

用例:类的构造函数将std::weak_ptr<Foo>作为依赖项。传递过期的对象是可以的(可能在某些工作流程中发生),但传递null意味着程序员忘记了某些事情。我想在构造函数的参数验证中测试它。

1 个答案:

答案 0 :(得分:17)

std::weak_ptr::owner_before可以区分空指针和过期的弱指针。因此,您可以将PointsToValidOrExpiredObject实现为:

template <typename T>
bool PointsToValidOrExpiredObject(const std::weak_ptr<T>& w) {
    return w.owner_before(std::weak_ptr<T>{}) ||
           std::weak_ptr<T>{}.owner_before(w);
}

Demo

Regarding the original uncertainty I had about an expired weak_ptr still maintaining ownership:我现在确定一般的图书馆范围的线程安全要求要求过期的weak_ptr继续具有相同的所有权。否则,销毁线程A中最后剩余的shared_ptr将必须显着修改与所讨论的weak_ptr共享所有权的一个/部分/全部shared_ptr的状态。如果线程B同时检查这样的weak_ptr的状态,那么你将会有一个由库实现引入的数据竞争,这通常是被禁止的。