我正在尝试获取别名共享指针的托管对象。我的想法是使用弱指针。由于弱指针不会产生任何对象,我认为从共享指针创建一个弱指针会使弱指针忘记别名共享指针的存储对象,因此锁定弱指针将产生一个共享指针与等量存储和托管指针。但结果让我感到困惑。弱指针是否记住了构造的共享指针?有没有办法如何获取别名共享指针的托管对象?
template<class T> struct Deleter {
void operator()(T* p) const {};
};
Deleter<T> d {};
T t1 {};
T* p1 = &t1;
T t2 {};
T* p2 = &t2;
auto sp1 = std::shared_ptr<T>(p1,d);
auto sp2 = std::shared_ptr<T>(sp1,p2);
auto wp = std::weak_ptr<T>(sp2);
std::cout << sp1.get() << " " << sp2.get() << " " << wp.lock().get() << std::endl;
生成0x7fff5798c958 0x7fff5798c948 0x7fff5798c948
答案 0 :(得分:1)
弱指针是否记住了构建共享指针的原因?
它会记住由构造它的shared_ptr
存储的原始指针。如果事情按照你期望的方式运作,我认为会很困惑。例如,如果函数收到shared_ptr<T>
作为参数,则不知道它是否是别名。如果那个函数想要从那个weak_ptr
中取shared_ptr
,那么我认为,如果找到weak_ptr
到shared_ptr
的实现,那将是非常令人惊讶的行为与获取它的原始shared_ptr
完全不同的对象。
另请注意,别名shared_ptr
可以存储与别名的shared_ptr
不同的类型。这些类型甚至不必相互转换。从别名weak_ptr
构造的shared_ptr
从其构造的shared_ptr
(或隐式可转换类型)中获取其存储类型。
别名shared_ptr
的最常见用例,我怀疑(即使我从来没有需要),也就是传递一个共享对象的成员,并且是即使不再需要其余的拥有对象,也要确保它仍然存活。因此,您构建的场景,其中别名shared_ptr
的类型与原始类型相同,看起来并不常见。
有没有办法获取别名共享指针的托管对象?
据我所知,没有。也许应该有。如果您认为此功能有用,请提出建议。 https://groups.google.com/a/isocpp.org/forum/?fromgroups#!forum/std-proposals