首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >智能指针的意外行为

智能指针的意外行为
EN

Stack Overflow用户
提问于 2016-09-04 22:48:11
回答 1查看 78关注 0票数 1

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

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-04 23:30:13

弱指针是否从构造的共享指针中记起?

它记住由构造它的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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39322139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档