考虑以下代码:
#include <memory>
#include <iostream>
using namespace std;
struct MySharedStruct
{
int i;
};
void print_value_of_i(weak_ptr<MySharedStruct> weakPtr)
{
if (shared_ptr<MySharedStruct> sp = weakPtr.lock())
{ cout << "Value of i = " << sp->i << endl; }
else
{ cout << "Resource has expired"; }
}
int main()
{
shared_ptr<MySharedStruct> sharedPtr(new MySharedStruct() );
sharedPtr->i = 5;
weak_ptr<MySharedStruct> weakPtr;
weakPtr = sharedPtr;
print_value_of_i(weakPtr);
sharedPtr.reset(new MySharedStruct() ); // <<----- How does weak_ptr know it has expired after this line executes?
sharedPtr->i = 10;
print_value_of_i(weakPtr);
return 0;
}
如何weak_ptr
考虑到资源,它已经过期shared_ptr
引用是否基本上已被其他资源取代?什么是weak_ptr
跟踪并确定old共享资源被销毁并被替换new共享资源?方法的示例定义(如果相关)lock
in weak_ptr
将不胜感激。
当a时分配的控制块shared_ptr
从一个普通指针创建,该指针包含对象的引用计数器和指向对象本身的指针以及自定义删除器对象(如果有)。当引用计数器达到零时,对象被释放并将指针设置为空。因此,当对象引用计数器为零时,意味着该对象消失了。
对于 x86 和 x86-64,它们使用原子操作并且没有显式锁定(没有互斥锁或自旋锁)。实现的技巧是一个特殊的无锁(忙自旋的代码语言)函数atomic_conditional_increment
仅当对象引用计数器不为零时才递增。它用于实现weak_ptr::lock
当多个线程尝试创建一个线程时,函数可以应对竞争shared_ptr
来自同一个weak_ptr
对象引用计数器为零。看http://www.boost.org/doc/libs/1_52_0/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp
控制块本身在之间共享shared_ptr
's and weak_ptr
并为其自身提供了另一个引用计数器,以便它保持活动状态,直到释放对它的最后一个引用。
When a shared_ptr
被重新分配它指向另一个控制块,因此控制块仅指向一个相同的对象。换句话说,控制块中的一个对象不会被另一个对象替换。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)