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

C++ 如何将boost::shared_ptr引入现有(大型)C++;代码库?,c++,boost,refactoring,shared-ptr,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> #endi

我目前正试图通过引入智能指针的使用来修复代码库中的一些弱点。代码库非常大,并且像一只吃过一对多咖啡的蜘蛛一样相互关联

我想知道人们以前是否尝试过这种方法,他们的方法是什么

我的第一步是使用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
}
当启用智能指针时,将完全停止

我想知道,在这个早期阶段,我是否可以做些什么来减少大量的编译错误,或者,我怀疑这只是根据具体情况进行处理

干杯
Rich

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

假设旧代码中至少有一些delete调用?在智能指针的情况下,这肯定会失败


智能指针:无论是否确定某些事情,即通过代码库追踪特定实例。让它工作起来,然后继续前进。祝你好运

不用在任何地方引入智能指针,你可以使用垃圾收集器,保持代码库完好无损


它还将处理循环引用。

实现这一点并不容易。正如您所发现的,
boost::shared_ptr
s和标准指针是不能互换的。您在这里所做的是重构代码,不幸的是重构需要很长时间,而且可能非常乏味

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

首先,我将确定实际需要更改为
shared\u ptr
s的指针。显然,您不希望将所有指针都更改为
shared\u ptr
s。大多数可能作为
std::auto_ptr
s或
boost::scoped_ptr
s更好,一些作为
boost::weak_ptr
更好,最后一些可能只是简单的C风格指针


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

在将共享ptr引入现有大型代码库时,我会有很大的限制。如果您真的想使用智能指针来修复错误,我建议使用范围指针,除此之外,我将重构代码并设计明确的所有权。

+1:关于循环引用的备注很重要。如果使用智能指针(使用
weak_ptr
来打破循环),则必须注意这一点。Boehm Collector的一个重要特点是它很保守,不能保证清除所有垃圾。它也不是确定性的,就像所有没有引用计数的收集器一样。看着大量的代码,我开始认为你是对的。感谢您阻止我进行疯狂的代码筛选。开始这种转换(如果您确定某个特定类型应该始终是
共享的ptr
弱的ptr
)最简单的方法可能是使用自工厂模式——创建一个静态共享的ptr X::create(…)方法,并将构造函数更改为private或protected。现在修复所有编译器错误。一次只能打一种类型!(好吧,您可能需要同时执行派生类。)
CTObjectPtr i = NULL;