我目前正试图通过引入智能指针来解决代码库中的一些弱点。代码库非常大,并且像蜘蛛那样相互关联,他们有一到多个咖啡。
我想知道人们是否曾尝试过以前的做法以及他们的做法。
我的第一步是输入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。
我想知道在这个早期阶段我能做些什么来减少编译错误的数量,或者是因为我怀疑只是根据具体情况采取措施。
干杯 富
答案 0 :(得分:9)
不要这样做:我的意思是typedef。
据推测,旧代码中至少有一些删除调用吗?在智能指针的情况下肯定会失败。
智能指针是否有某些东西,即通过代码库追逐特定实例。让它工作,然后继续前进。祝你好运!
答案 1 :(得分:6)
不要试图在任何地方引入智能指针,而是使用Boehm-Demers-Weiser垃圾收集器并保持代码库不变。
它还将处理循环引用。
答案 2 :(得分:3)
没有简单的方法可以做到这一点。正如您所知,boost::shared_ptr
和标准指针不可互换。你在这里做的是重构代码,不幸的是重构需要很长时间,而且非常繁琐。
正如sdg所说,typedef
指向shared_ptr
的指针并不是一个好主意,只会增加你必须编写的代码量。
首先,我会确定实际需要更改为shared_ptr
的指针。显然你不想改变shared_ptr
的所有指针。大部分可能会更好,因为std::auto_ptr
或boost::scoped_ptr
s,有些会更好boost::weak_ptr
,最后有些可能只是普通的C风格指针。
只需浏览每个需要逐个更改的指针,找到对它的所有引用,然后进行必要的调整(例如删除对delete
的调用)。
答案 3 :(得分:0)