gpt4 book ai didi

c++ - C++中的安全指针取消引用

转载 作者:IT老高 更新时间:2023-10-28 22:41:28 25 4
gpt4 key购买 nike

在我们的代码库中,我们有很多这样的结构:

auto* pObj = getObjectThatMayVeryRarelyBeNull();
if (!pObj) throw std::runtime_error("Ooops!");
// Use pObj->(...)

在 99.99% 的情况下,不会触发此检查。我正在考虑以下解决方案:

auto& obj = deref_or_throw(getObjectThatMayVeryRarelyBeNull());
// Use obj.(...)

其中deref_or_throw声明如下:

template<class T> T& deref_or_throw(T* p) {
if (p == nullptr) { throw std::invalid_argument("Argument is null!"); }
return *p;
}

该代码更清晰,可以按我的需要工作。

问题是:我是在重新发明轮子吗?标准或增强中有一些相关的解决方案吗?或者您对解决方案有什么意见?

PS。相关问题(没有满意的答案):Is there a C++ equivalent of a NullPointerException

最佳答案

有两种方法可以处理“罕见的空指针”问题。首先,它是建议的异常解决方案。为此,deref_or_throw 方法是一件好事,尽管我更愿意抛出 runtime_error,而不是 invalid_argument 异常。如果您愿意,也可以考虑将其命名为 NullPointerException

但是,如果 ptr != nullptr 情况实际上是算法的先决条件,那么您应该尽最大努力在这种非空情况下实现 100% 的安全性。 assert 在这种情况下是合适的。

assert的优点:

  • 在 Release模式下运行时免费
  • 让开发人员清楚地知道,他有责任让这种情况永远不会发生。

assert的缺点:

  • Release模式下潜在的未定义行为

您还应该考虑编写一个方法 getObjectThatMayNeverBeNullButDoingTheSameAsGetObjectThatMayVeryRarelyBeNull():该方法保证返回一个指向对象的非空指针,该对象在其他方面完全等同于您的原始方法。但是,如果您可以加倍努力,我强烈建议您不要返回原始指针。拥抱 C++11 并按值返回对象:-)

关于c++ - C++中的安全指针取消引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29122246/

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