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

时间:2010-02-24 16:18:45

标签: c++ boost refactoring 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
}

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

CTObjectPtr i = NULL;

启用智能指针时会完全bork。

我想知道在这个早期阶段我能做些什么来减少编译错误的数量,或者是因为我怀疑只是根据具体情况采取措施。

干杯 富

4 个答案:

答案 0 :(得分:9)

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

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

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

答案 1 :(得分:6)

不要试图在任何地方引入智能指针,而是使用Boehm-Demers-Weiser垃圾收集器并保持代码库不变。

它还将处理循环引用。

答案 2 :(得分:3)

没有简单的方法可以做到这一点。正如您所知,boost::shared_ptr和标准指针不可互换。你在这里做的是重构代码,不幸的是重构需要很长时间,而且非常繁琐。

正如sdg所说,typedef指向shared_ptr的指针并不是一个好主意,只会增加你必须编写的代码量。

首先,我会确定实际需要更改为shared_ptr的指针。显然你不想改变shared_ptr的所有指针。大部分可能会更好,因为std::auto_ptrboost::scoped_ptr s,有些会更好boost::weak_ptr,最后有些可能只是普通的C风格指针。

只需浏览每个需要逐个更改的指针,找到对它的所有引用,然后进行必要的调整(例如删除对delete的调用)。

答案 3 :(得分:0)