智能指针的意外行为

Unexpected behavior of 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

Does the weak pointer remember from what share pointer is constructed?

它会记住由 shared_ptr 存储的原始指针,从中构造它。我认为如果事情按照您期望的方式进行,那将会非常混乱。例如,如果一个函数接收到一个 shared_ptr<T> 作为参数,它不知道它是否是别名。如果那个函数然后想从那个 shared_ptr 中获取一个 weak_ptr,我认为,发现将 weak_ptr 实现为 shared_ptr 给出了非常令人惊讶的行为与获得它的原始 shared_ptr 完全不同的对象。

另请注意,别名 shared_ptr 可以存储与别名 shared_ptr 不同的类型。这些类型甚至不必相互转换 to/from。由别名 shared_ptr 构造的 weak_ptr 从构造它的 shared_ptr 中获取其存储类型(或隐式可转换类型)。

最常见的别名用例 shared_ptr,我怀疑(即使我从来没有需要过)是传递一个共享对象的成员,并成为即使不再需要拥有的对象的其余部分,也要确保它保持活动状态。因此,您构建的场景中,别名 shared_ptr 的类型与原始类型相同,这似乎并不常见。

And is there a way how to get the managed object of an aliased shared pointer?

据我所知,没有。也许应该有。如果您认为此功能有用,请提出。 https://groups.google.com/a/isocpp.org/forum/?fromgroups#!forum/std-proposals