智能指针的意外行为

时间:2016-09-04 22:48:12

标签: c++ smart-pointers

我正在尝试获取别名共享指针的托管对象。我的想法是使用弱指针。由于弱指针不会产生任何对象,我认为从共享指针创建一个弱指针会使弱指针忘记别名共享指针的存储对象,因此锁定弱指针将产生一个共享指针与等量存储和托管指针。但结果让我感到困惑。弱指针是否记住了构造的共享指针?有没有办法如何获取别名共享指针的托管对象?

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

1 个答案:

答案 0 :(得分:1)

  

弱指针是否记住了构建共享指针的原因?

它会记住由构造它的shared_ptr存储的原始指针。如果事情按照你期望的方式运作,我认为会很困惑。例如,如果函数收到shared_ptr<T>作为参数,则不知道它是否是别名。如果那个函数想要从那个weak_ptr中取shared_ptr,那么我认为,如果找到weak_ptrshared_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

相关问题