如何将boost :: shared_ptr引入现有(大型)C++代码库?

Ric*_*ich 6 c++ refactoring boost shared-ptr

我目前正试图通过引入智能指针来解决代码库中的一些弱点.代码库非常大,并且像一只拥有一对多咖啡的蜘蛛相互关联.

我想知道人们是否曾尝试过以前的做法以及他们的做法是什么.

我的第一步是typedef类,如下所示.

#ifndef USE_SMART_POINTERS
    #define USE_SMART_POINTERS 0
#endif

#if USE_SMART_POINTERS == 1
    #include <boost/smart_ptr.hpp>
#endif


namespace ProductX
{
    // forward decleration
    class CTObject;


    //typedefs
    #if USE_SMART_POINTERS == 1
        typedef boost::shared_ptr<CTObject> CTObjectPtr;
    #else
        typedef CTObject* CObjectPtr;
    #endif
}
Run Code Online (Sandbox Code Playgroud)

现在我意识到这将导致丰富的编译领域,比如

CTObjectPtr i = NULL;
Run Code Online (Sandbox Code Playgroud)

当智能指针启用时,将完全bork.

我想知道在这个早期阶段是否有任何我可以做的事情来减少编译错误的数量,或者是因为我怀疑只是根据具体情况进行处理.

干杯里奇

sdg*_*sdg 9

不要这样做:我的意思是typedef.

据推测旧代码至少有一些删除调用吗?在智能指针的情况下肯定会失败.

智能指针是否有某些东西,即通过代码库追逐特定实例.让它工作,然后继续前进.祝好运!


Ale*_*min 5

您可以使用Boehm-Demers-Weiser垃圾收集器而不是尝试在任何地方引入智能指针,并保持代码库完好无损.

它还将处理循环引用.

  • 关于Boehm收藏家的一个重要观点是,它是保守的 - 它不能保证清理所有垃圾.与所有非参考计数收集者一样,它也不是确定性的. (6认同)
  • +1:关于循环引用的评论很重要.如果使用智能指针(使用`weak_ptr`打破周期),必须注意这一点 (3认同)