我一直在评估各种智能指针实现(哇,有很多),在我看来,大多数可以分为两大类:
1)此类别对引用的对象使用继承,以便它们具有引用计数,并且通常实现up()和down()(或它们的等价物).IE,要使用智能指针,您指向的对象必须从ref实现提供的某些类继承.
2)此类别使用辅助对象来保存引用计数.例如,不是将智能指针指向对象,而是实际指向此元数据对象...谁具有引用计数以及up()和down()实现(并且通常为指针提供一种机制)获取指向的实际对象,以便智能指针可以正确实现operator - >()).
现在,1有一个缺点,它强制你想引用的所有对象计数从一个共同的祖先继承,这意味着你不能使用它来引用你无法控制源代码的计数对象至.
2有一个问题,因为计数存储在另一个对象中,如果你有一个指向现有引用计数对象的指针被转换为引用的情况,你可能有一个错误(IE,因为计数不在实际的对象,新的引用没有办法得到计数...引用ref复制构造或赋值是好的,因为它们可以共享count对象,但如果你必须从指针转换,你'完全被冲洗了)...
现在,正如我所理解的那样,boost :: shared_pointer使用了机制2,或类似的东西......那就是说,我不能完全决定哪个更糟糕!我只使用机制1,在生产代码中......有没有人有这两种风格的经验?或许还有另一种方式比这两种方式更好?
"在C++中实现智能指针的最佳方法是什么?"
别! 使用现有的经过良好测试的智能指针,例如boost :: shared_ptr或std :: tr1 :: shared_ptr(std :: unique_ptr和std :: shared_ptr与C++ 11)
如果必须,请记住:
使用safe-bool成语
提供运营商 - >
提供强有力的例外保证
记录您的类对删除器的异常要求
尽可能使用copy-modify-swap来实现强大的异常保证
记录您是否正确处理多线程
写广泛的单元测试
以这样的方式实现转换为base,它将在派生的指针类型上删除(policied smart pointers/dynamic deleter smart pointers)
支持访问原始指针
考虑提供破坏周期的弱指针的成本/利益
为您的智能指针提供合适的铸造操作符
使您的构造函数模板化以处理从派生构造基指针.
不要忘记我在上面不完整的清单中遗忘的任何事情.
只是为无处不在的Boost答案提供不同的视图(即使它是许多用途的正确答案),看看Loki的智能指针实现.对于设计哲学的讨论,Loki的原始创作者编写了" 现代C++设计 "一书.
我已经使用boost :: shared_ptr好几年了,虽然你正确的下行(没有通过指针可能的任务),我认为这绝对是值得的,因为它节省了大量与指针相关的错误.
在我的自制游戏引擎中,我尽可能地用shared_ptr替换了普通指针.如果你通过引用调用大多数函数,那么性能上升的原因实际上并不是那么糟糕,因此编译器不必创建太多临时的shared_ptr实例.