我有一些项目使用boost::shared_ptr或std::shared_ptr广泛使用(我可以很快转换为任何一种实现,如果对于一个问题有一个很好的答案,而不是另一个).Boost实现使用Boost.Assert来避免在运行时operator*或operator->运行时遇到空(NULL)指针的情况下返回; 而libc ++实现似乎缺乏任何检查.
当然,shared_ptr在使用之前应该检查a的有效性,一个大的,混合范式的代码库让我想要尝试抛出异常的变异; 因为大多数代码都是相对异常感知的,并且最多会失败到高级但可恢复的状态,而不是std::terminate()或段错误.
我应该如何最好地定制这些访问器,同时保持稳健性shared_ptr?似乎封装shared_ptr在一个throwing_shared_ptr可能是最好的选择,但我担心打破魔法.我最好复制Boost源并将ASSERTs更改为适当的throw语句?
对于适当的smart_ptr<T>类型,到处使用的实际类型名称是从宏扩展的typedef; 即ForwardDeclarePtr(Class)扩展为:
class Class;
typedef boost::smart_ptr<Class> ClassPtr;
Run Code Online (Sandbox Code Playgroud)
一切都通过,接受或存储ClassPtr- 所以我可以非常自由地替换基础类型; 我怀疑这可以减轻潜在的切片/隐藏问题.