rva*_*lue 6 c++ exception shared-ptr c++11 libc++
我有一些项目使用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- 所以我可以非常自由地替换基础类型; 我怀疑这可以减轻潜在的切片/隐藏问题.
std::shared_ptr<T>如果你将它包装在一个自定义类中,并且在解除引用NULL共享指针时会引发异常,那么实际上没有"神奇" .所以我不明白为什么这种方法不起作用,只要你的新包装类遵循该std::shared_ptr<T>类型的所有语义.
顺便说一句,您也可以采用稍微不同的方法,这就是创建一个包装类,它不会允许其他人在第一个位置将NULL指针传递给包装的std::shared_ptr<T>数据成员.基本上它将是一个std::make_shared<T>在其构造函数中强制执行成语的类.我不确定,如果可能的话,基于你的代码的工作方式,但这是使用RAII方法而不是抛出异常来规避问题的另一种方法.
只要继承std::shared_ptr到throwing_shared_ptr,覆盖这两种方法,并让他们主张并呼吁通过到std::shared_ptr的IMPL.只要你throwing_shared_ptr在任何地方使用而不是将它切成一个,这应该可以正常工作std::shared_ptr.
| 归档时间: |
|
| 查看次数: |
1909 次 |
| 最近记录: |