我正在使用一个大型的c ++代码库,该代码库在过去10年中得到了发展和有机地发展。我一直在看的项目之一是,当shared_ptr(通过make_shared)被“过度使用”时,它们很容易成为unique_ptr的代名词。
在重构以正确使用上述指针时,我们已经取得了不懈的努力,并且看到了出色的性能;但是,我想知道是否有某种方法可以自动检测何时实际滥用了指针,并且有资格代替unique_ptr。
这既用于“清除”代码库(整洁的样式)以使重构负担更容易,也可以用于进行模式检测指针何时发生滥用并防止其处于“预提交”级别
我翻阅了各种文章和堆栈溢出文章,以及翻阅了gcc和clang编译器选项,但还没有完全找到我一直在寻找的东西。
答案 0 :(得分:7)
我不知道执行此操作的自动化方法,但是您可以:
shared_ptr
替换为unique_ptr
unique_ptr
就足够了shared_ptr
unique_ptr
就足够了但是,这是一种比较钝的方法。最终,没有什么替代品可以真正地分析您的大脑的每种用法。而且,是的,我知道使用大型代码库会有些痛苦。解决这一问题的最重要方法(无论如何,如果您可以时光倒流的话)是十年之内不增加技术债务!
答案 1 :(得分:0)
我会有另一种方法。像一个包含一个std::shared_ptr
的类。尝试查看为什么它是共享的(主要是为了能够复制类或将指针保存在许多地方)。查看可以使用的解决方案。
我进行重构的方法是从理论上研究上下文。在纸上,两个类(共享指针的容器和指针)的生存期是否已知?他们的一生是否受束缚或无关?通过将这两个类的生命周期链接到一起或连接到系统来解决。尝试使模型清晰。记录下来。自然地,通过将生命周期分组为逻辑单位,您可以拖动更多相关的类。
然后,在完成模型后,将其转换为代码。尽可能逐步进行并仔细计划。 仅在必须知道要操纵的对象的寿命时使用std::unique_ptr
或std::shared_ptr
。否则,请考虑(不拥有)原始指针或引用。该代码应尽可能接近您的模型。如果实施时出现问题,请修改模型。