在任何地方使用共享指针有哪些陷阱?

What are the pitfalls of using shared pointers everywhere?

本文关键字:陷阱 指针 任何地 方使用 共享      更新时间:2023-10-16

我们的代码库使用许多向量。其中一些向量彼此共享对象,即它们包含共享对象的std::shared_ptr。问题是:代码库仍处于活跃的开发阶段,通常需要将一些包含值的向量重写为包含共享指针的向量。这很乏味。所以我想出了一个主意:简单地将所有向量作为共享指针的向量。

问题是:可以吗?我应该注意哪些注意事项?可能出现什么问题?

我做了一些简单且可能幼稚的测量,在初始化和查询值向量和共享指针向量时,它们在性能方面几乎没有区别。

如果性能不是问题,还有什么我应该注意的吗?

我认为这是一个坏主意,JAVA就是这样做的,当你忘记了对象被共享的跟踪并且你通过巨大的代码库中的某个地方的一些临时更改"破坏"它时,这通常会导致问题。

如果将std::vector与内部对象一起使用,则几乎没有性能问题,除非包含的对象非常大或具有复杂的构造函数。

只有在严格需要时才应在向量中使用指针(共享或非共享(,例如:

  • 如果包含的对象是多态的
  • 如果包含的对象具有一些不可复制的字段 (IEstd::mutex(
  • 如果包含的对象真的很大(IE 视频帧(