[英]Is there a weak_ptr equivalent to shared_from_this?
我有一个我知道将永远属于std::shared_ptr
。 但是,将shared_ptr
甚至weak_ptr
传递给不需要所有权或生命周期保证的函数和方法会产生不必要的开销。 为了解决这个问题,我经常将原始指针传递给函数。 类本身继承自std::enable_shared_from_this
因此如果函数需要获取指针的所有权,它可以使用类的方法来获取shared_ptr
。
这一切都很美妙。 但是有时候我真的不想从原始指针创建shared_ptr
,而我想要的是weak_ptr
。
根据我对std::shared_ptr
的通常实现的理解,它有两个原子变量用作引用计数器; 一个用于shared_ptr
,一个用于weak_ptr
。
如果我只有一个指向我的类的原始指针,并且我想要一个weak_ptr
,我必须首先创建一个shared_ptr
并将其转换。 这样做意味着引用计数器会像这样改变:
shared_ptr
,增加shared_ptr
计数器 weak_ptr
,增加weak_ptr
计数器 shared_ptr
超出范围,减少shared_ptr
计数器 这似乎违背了“你不为你不使用的东西买单”的想法。 有没有办法让我的班级在没有首先创建shared_ptr
情况下提供weak_ptr
?
在2015年10月的会议中,提案P0033被C ++ 17接受,它将weak_from_this
添加到源自std::enable_shared_from_this
。
有没有办法让我的班级在没有首先创建shared_ptr的情况下提供weak_ptr?
不是在C ++ 14中; enable_shared_from_this
支持的唯一操作是创建shared_ptr
。 现在, enable_shared_from_this
应该有足够的信息来直接构造weak_ptr
。 但是你不能从外面做,因为类没有向你公开它的实现细节。
C ++ 17支持通过weak_from_this
从enable_shared_from_this
类中获取weak_ptr
。
实施它几乎是微不足道的,不值得放入图书馆......
#include <memory>
template<class T> std::weak_ptr<T> weak_from_this(T*p) {
return { p->shared_from_this() };
}
struct S : std::enable_shared_from_this<S>
{
auto foo() {
return weak_from_this(this);
}
};
int main()
{
auto ps = std::make_shared<S>();
auto wps = ps->foo();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.