gpt4 book ai didi

c++ - 自定义 std::shared_ptr 或 boost::shared_ptr 以在 NULL 取消引用时抛出异常

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:08:09 24 4
gpt4 key购买 nike

我有几个项目使用 boost::shared_ptrstd::shared_ptr广泛地(如果对这个问题有一个很好的答案,但另一个没有),我可以尽快转换为任一实现。 Boost 实现使用 Boost.Assert 来避免在 operator* 中遇到空 (NULL) 指针时返回。或 operator->在运行时;而 libc++ 实现似乎缺少任何检查。

当然 shared_ptr 的有效性应该在使用前检查,一个大的、混合范式的代码库让我想尝试一个异常抛出的变体;因为大多数代码都相对异常敏感,并且最多会失败到高级但可恢复的状态,而不是 std::terminate()或段错误。

我应该如何最好地自定义这些访问器,同时保持 shared_ptr 的稳健性? ?好像封装了shared_ptrthrowing_shared_ptr可能是最好的选择,但我对打破魔法持谨慎态度。我是否最好复制 Boost 源并仅更改 ASSERT s 到适当的 throw声明?


为适当的 smart_ptr<T> 到处使用的实际类型名称type 是从宏扩展而来的 typedef;即 ForwardDeclarePtr(Class)扩展为类似:

class Class;
typedef boost::smart_ptr<Class> ClassPtr;

一切都传递、获取或存储 ClassPtr - 这样我就可以很自由地替换底层类型;我怀疑这可以缓解潜在的切片/隐藏问题。

最佳答案

std::shared_ptr<T> 中真的没有“魔法”如果您将它包装在一个自定义类中,该自定义类将在取消引用 NULL 时抛出异常,那么它将被删除共享指针。所以我不明白为什么这种方法不起作用,只要你的新包装类遵循 std::shared_ptr<T> 的所有语义。类型。

顺便说一句,你也可以采取稍微不同的方法,那就是创建一个包装类,不允许其他人通过 NULL指向包装的 std::shared_ptr<T> 的指针首先是数据成员。基本上它将是一个强制执行 std::make_shared<T> 的类它的构造函数中的成语。我不确定,根据您的代码的工作原理,这是否可能,但这是使用 RAII 方法而不是抛出异常来规避问题的另一种方法。

关于c++ - 自定义 std::shared_ptr 或 boost::shared_ptr 以在 NULL 取消引用时抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12452565/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com