到处使用共享指针有啥陷阱?

Posted

技术标签:

【中文标题】到处使用共享指针有啥陷阱?【英文标题】:What are the pitfalls of using shared pointers everywhere?到处使用共享指针有什么陷阱? 【发布时间】:2019-09-06 12:33:10 【问题描述】:

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

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

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

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

【问题讨论】:

@Ron: 多态类型的向量,共享对象... 我提供了反例(这在我看来并不罕见)。 多态性是在现代 C++ 中使用指向已分配对象的指针而不仅仅是一个对象的主要原因之一。 如果您的向量包含您不会共享的对象,那么我不建议为它们使用shared_ptrshared_ptr如果您不打算使用它,则无需支付记账费用。 如果您了解整个 API 和所有数据结构,那么您就知道哪些向量需要共享指针,哪些不需要。好吧,有时事情会出错,计划必须适应,但你所说的那种变化是根本性的,表明存在流程问题。您应该解决这个问题,而不是采用您建议的方法。 【参考方案1】:

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

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

只有在严格需要时才应该在向量中使用指针(无论是否共享),例如:

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

【讨论】:

您能否展示或解释为什么多态对象对决策很重要? 我将问题解读为包含共享对象的向量是前提。你完全错过了这一点 我在这里看到的唯一警告是,由于副作用,共享对象很糟糕。但在我们的案例中,这是一个要求。我在问有什么其他理由不这样做。 @NurbolAlpysbayev ^ 这是关于多态性的链接。你应该点击它。 互斥体的共享所有权,可能出现什么问题?

以上是关于到处使用共享指针有啥陷阱?的主要内容,如果未能解决你的问题,请参考以下文章

JDBC + PL/SQL = 这么简单,还是有啥陷阱?

本地机器上的 Web 服务器,有啥陷阱吗?

使用指针时的“陷阱”

使用 ASP.NET 共享主机的 10 大陷阱

Linux共享内存使用常见陷阱与分析

为啥到处都使用套接字指针而不是套接字实例?