C++ 到处使用共享指针的陷阱是什么?

C++ 到处使用共享指针的陷阱是什么?,c++,pointers,vector,C++,Pointers,Vector,我们的代码库使用许多向量。其中一些向量彼此共享对象,即它们包含共享对象的std::shared_ptr。问题是:代码库仍处于活动开发阶段,通常需要将一些包含值的向量重写为包含共享指针的向量。这很乏味。所以我想出了一个主意:简单地将所有向量作为共享指针的向量 问题是:这样行吗?我应该注意哪些注意事项?什么会出错 我做了一些简单且可能幼稚的测量,在初始化和查询值向量和共享指针向量时,它们的性能几乎没有区别 如果性能不是问题,还有什么我应该注意的吗?我认为这是一个坏主意,JAVA会这样做,当您忘记对象

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

问题是:这样行吗?我应该注意哪些注意事项?什么会出错

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


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

我认为这是一个坏主意,JAVA会这样做,当您忘记对象是共享的,并且您在庞大的代码库中的某个地方进行了一些临时更改时,这通常会导致问题

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

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

  • 如果包含的对象是多态的
  • 如果包含的对象有一些非平凡的可克隆字段(即
    std::mutex
  • 如果包含的对象非常大(如视频帧)

@ Ron:多态类型的向量,共享对象…我提供反例(我觉得这并不罕见)。多态性是使用指针到分配对象而不是现代C++中对象的主要原因之一。如果你有矢量,你将不会共享对象,那么,我不建议为他们使用
共享\u ptr
。如果您不打算使用共享指针,则无需支付记账费用。如果您知道整个API和所有数据结构,那么您就知道哪些向量需要共享指针,哪些不需要。好吧,有时候事情会出错,计划必须适应,但你所说的那种变化是根本性的,表明了一个过程问题。你应该解决这个问题,而不是采用你建议的方法。你能说明或解释为什么多态对象对决策很重要吗?我理解这个问题,因为包含共享对象的向量是前提。你完全没有注意到这一点我在这里看到的唯一警告是,由于副作用,共享对象是不好的。但这是我们的要求。我在问还有什么其他原因不这样做。@NurbolAlpysbayev^这就是多态性的联系。你应该点击它。共享互斥锁的所有权,可能会出什么问题?