自动检测何时shared_ptr应该真正是unique_ptr

时间:2019-02-19 23:45:32

标签: c++

我正在使用一个大型的c ++代码库,该代码库在过去10年中得到了发展和有机地发展。我一直在看的项目之一是,当shared_ptr(通过make_shared)被“过度使用”时,它们很容易成为unique_ptr的代名词。

在重构以正确使用上述指针时,我们已经取得了不懈的努力,并且看到了出色的性能;但是,我想知道是否有某种方法可以自动检测何时实际滥用了指针,并且有资格代替unique_ptr。

这既用于“清除”代码库(整洁的样式)以使重构负担更容易,也可以用于进行模式检测指针何时发生滥用并防止其处于“预提交”级别

我翻阅了各种文章和堆栈溢出文章,以及翻阅了gcc和clang编译器选项,但还没有完全找到我一直在寻找的东西。

2 个答案:

答案 0 :(得分:7)

我不知道执行此操作的自动化方法,但是您可以:

  1. 暂时将 all shared_ptr替换为unique_ptr
  2. 每次编译器抱怨(由于尝试复制):
    • 弄清楚是否会采取行动
    • 如果是,则unique_ptr就足够了
    • 否则,请返回shared_ptr
  3. 每隔一次unique_ptr就足够了

但是,这是一种比较钝的方法。最终,没有什么替代品可以真正地分析您的大脑的每种用法。而且,是的,我知道使用大型代码库会有些痛苦。解决这一问题的最重要方法(无论如何,如果您可以时光倒流的话)是十年之内不增加技术债务!

答案 1 :(得分:0)

我会有另一种方法。像一个包含一个std::shared_ptr的类。尝试查看为什么它是共享的(主要是为了能够复制类或将指针保存在许多地方)。查看可以使用的解决方案。

我进行重构的方法是从理论上研究上下文。在纸上,两个类(共享指针的容器和指针)的生存期是否已知?他们的一生是否受束缚或无关?通过将这两个类的生命周期链接到一起或连接到系统来解决。尝试使模型清晰。记录下来。自然地,通过将​​生命周期分组为逻辑单位,您可以拖动更多相关的类。

然后,在完成模型后,将其转换为代码。尽可能逐步进行并仔细计划。 在必须知道要操纵的对象的寿命时使用std::unique_ptrstd::shared_ptr。否则,请考虑(不拥有)原始指针或引用。该代码应尽可能接近您的模型。如果实施时出现问题,请修改模型。