dlf*_*dlf 15 c++ weak-ptr c++11
例如:
std::weak_ptr<int> wp1(std::make_shared<int>());
std::weak_ptr<int> wp2;
assert(PointsToValidOrExpiredObject(wp1));
assert(!PointsToValidOrExpiredObject(wp2));
Run Code Online (Sandbox Code Playgroud)
这样的功能可能吗?
用例:类的构造函数std::weak_ptr<Foo>作为依赖项.传递过期的对象是可以的(可能在某些工作流程中发生),但传递null意味着程序员忘记了某些事情.我想测试它作为构造函数的参数验证的一部分.
Cas*_*sey 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);
}
Run Code Online (Sandbox Code Playgroud)
演示.
关于最初的不确定性我对过期的weak_ptr仍然保持所有权:我现在确定一般的图书馆范围的线程安全要求要求过期weak_ptr继续拥有相同的所有权.否则,销毁shared_ptr线程A中的最后剩余部分将必须显着地修改weak_ptr与所shared_ptr讨论的共享所有权的一个/一些/所有s 的状态.如果线程B同时检查了这种状态,weak_ptr那么你将会有一个由库实现引入的数据竞争,这通常是被禁止的.
| 归档时间: |
|
| 查看次数: |
1167 次 |
| 最近记录: |