【发布时间】:2020-03-16 03:25:04
【问题描述】:
我经常使用旧代码,其中原始指针与智能指针混合在一起,我没有时间将所有原始指针都更改为智能指针。
并且可能存在一些情况,例如指向对象的静态原始指针,该对象可能已经被破坏,起初似乎使用weak_ptr来保存引用,但问题出现了,因为原始的地方指针没有任何关于 shared_ptrs 已经指向同一个对象的信息。
所以:
1) 是否有任何更智能的智能指针可以跟踪指向对象的所有指针(原始指针和智能指针)?
2) 是否有任何更智能的智能指针至少可以跟踪对象的所有 shared_ptrs?
我不想讨论实现,如果可能的话,我想将它用作黑盒。
编辑:我问了 2),因为例如在一个对象上调用 make_shared 两次,会产生 2 个单独的 shared_ptr 引用计数器。
【问题讨论】:
-
简答:没有和没有。
-
想一想:您将如何实现如此智能的智能指针?当成员函数返回对其成员之一的指针/引用时,您如何捕获它?当成员函数返回
this时,如何捕获它?如果你像我一样回答“那是不可能的”,那么,你就知道为什么不存在这样的事情了…… -
(1) 肯定是不可能的。你能详细说明(2)吗?你想得到一个给定对象的所有
shared_ptrs 的列表……一个指向它的原始指针吗?还是共享的? -
听起来您希望对象能够自我意识到它们由智能指针(即
std::shared_ptr)管理。这就是std::enable_shared_from_this所做的。请注意,有些人(包括我自己)认为这是一种反模式,但按照标准,它是 C++ 语言的一部分。 -
请注意,如果您有
Foo foo;,然后执行auto ptr = std::make_shared<Foo>(foo);,则您有一个指向foo的副本 的指针,即一个单独的对象
标签: c++ shared-ptr smart-pointers reference-counting