【问题标题】:Are there some smarter smart pointers in C++?C++ 中是否有一些更智能的智能指针?
【发布时间】: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


【解决方案1】:

1) 是否有任何更智能的智能指针可以跟踪指向对象的所有指针(原始指针和智能指针)?

没有。没有这样的标准指针,而且这样的指针在标准 C++ 中是不可实现的。

2) 是否有任何更智能的智能指针至少可以跟踪对象的所有 shared_ptrs?

你的意思有点不清楚。所有权与共享指针的所有副本隐式共享。如果您的意思是您希望使用单独的共享指针来获得所有权,那么 C++ 中没有这样的智能指针。也许可以用全局数据结构来实现。

另一方面,std::enable_shared_from_this 可能是您正在寻找的东西。如果您尝试单独获取共享所有权,它仍然不起作用,但它提供了一种方便的方式来加入现有所有权,而无需访问任何共享指针。

【讨论】:

【解决方案2】:

您可能希望使用一种不以任何形式或形式基于 C 的语言进行编程。

C 有指针。智能指针不是真正的指针。

除非你发明了一种不同的语言,在任何级别都与 C 不兼容,否则你将始终拥有指针,并且这些指针不受任何所谓的“智能指针”的控制,它既不是智能也不是指针。

【讨论】:

  • @LukasSalich 确实 GC 存在很大问题。您是否知道历史上 Java(不是现代的、更健全的 Java)允许收集当前正在使用的对象?使用 GC 指定任何可靠的用户清理非常困难。
  • 我知道,那时我在大学用过 Java :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-12
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
  • 2016-10-09
  • 1970-01-01
相关资源
最近更新 更多