Tro*_*yvs 0 c++ reference shared-ptr weak-ptr make-shared
我的问题是:是否存在share_ptr引用计数为0,而weak_ptr引用计数不为0的情况?
C++中make_shared和普通shared_ptr的区别
引用这个线程,显示如果一个shared_ptr是由weak_ptr创建的,make_shared并且有weak_ptr,它的控制块将是活动的,until shared_ptr和weak_ptr的引用计数都为0。它说:
必须有一种方法让weak_ptr 确定托管对象是否仍然有效(例如锁)。他们通过检查拥有托管对象(存储在控制块中)的shared_ptr 数量来做到这一点。结果是控制块一直处于活动状态,直到共享指针计数和弱指针计数都达到 0。
我做了一个快速测试。我希望shared_ptr创建的make_shared,如果有weak_ptr指向它,control block在shared_ptr被破坏后它仍然会保存。
#include<memory>
#include<iostream>
using namespace std;
struct My {
int m_i;
My(int i) : m_i(i) { cout << "My ctor:" << m_i << '\n';}
~My() { cout << "My ctor:" << m_i << '\n';}
};
weak_ptr<My> wp1, wp2;
int main() {
{
auto sp1 = shared_ptr<My>(new My(30));
wp1 = weak_ptr<My>(sp1);
}
cout<< wp1.use_count() << endl;
{
auto sp2 = make_shared<My>(40);
wp2 = weak_ptr<My>(sp2);
}
cout<< wp2.use_count() << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
两者use_count都会打印0,我的程序似乎没有显示是否control blocks还活着。
那么,我们如何证明这一点呢The result is that the control blocks are alive until both shared_ptr and weak_ptr's ref count gets 0?
有任何可以测试/证明这个理论的示例代码吗?
这不是一个需要“证明”的“理论”。事实确实如此;该标准要求知道它们所链接的weak_ptr所有 s 何时被销毁。shared_ptr这是由于 的要求所必需的weak_ptr::lock。实现这一点的唯一可行方法(同时不违反线程安全保证,或以极其糟糕的方式提供它们)是拥有一块由弱指针和共享指针拥有的内存块,只有在所有指针都被释放后才将其释放。被毁了。
如果您希望看到这一点,您可以向 的shared_ptr构造函数传递用户定义的分配器类型。shared_ptr将使用它来分配控制块shared_ptr。只有当最后一个共享或弱指针被销毁时,控制块才会被删除。您可以对 执行同样的操作allocate_shared。
| 归档时间: |
|
| 查看次数: |
154 次 |
| 最近记录: |