通过引用或指针返回并检查null?

I have a class :

class A
{
  private:
    vector<int> x;
  public:
     const vector<int>& immutable_data() {
         return x;
      }
      vector<int>* mutable_data() {
          return &x;
      }
}

现在,如果我使用这个类,在我的代码中,是否必须检查mutable_data()返回的指针是否为null(假定我知道这个类的结构)。 我个人认为我不需要,因为我知道存在一个辅助api,它返回一个const引用,所以我的指针永远不能为null(我无法想象这个函数会返回null的场景,即使它不知何故返回null,在这种情况下,const ref版本的行为是什么)。 或者我应该说,我知道它的堆栈上的现有对象的地址,所以它不能为空? 这是对此进行思考或推理的正确方法吗? 如果有人以其他方式思考,请给出一些示例代码。

对于生产代码中更常见的情况:如果我使用协议缓冲区,我已经知道为我的消息模板生成的代码(例如:像stl容器一样的重复字段),但是每次我仍然需要执行空检查想要使用可变的API,因为它们总是通过指针或者const引用返回。

通过参考返回不是我正在寻找。


我必须检查mutable_data()返回的指针是否为null(假设我知道这个类的结构)

通常,像“必须检查指针”这样的设计元素取决于以下两件事之一:

  • 你的设计需要证明是安全的吗?
  • 如果不是,那么A::mutable_data()的设计A::mutable_data()指定它不会返回null
  • 如果(1),那么你应该投资那种基于SAT解决方案的工具,它可以静态测试你的代码不会访问无效内存。

    如果(2),我建议您考虑合同设计的概念 - 这是一个强大的概念。 如果A::mutable_data()的接口被指定为不返回null ,则返回null将是A::mutable_data()的设计缺陷。


    返回一个空指针通常意味着“我没有任何数据给你”。 如果该类总是有数据,那么设计上该函数将永远不会返回空指针。 如果是这种情况,那么使用该函数的代码不需要检查空指针。 这是该函数的保证之一:“我永远不会返回空指针”。

    链接地址: http://www.djcxy.com/p/20785.html

    上一篇: return by reference or pointer and check for null?

    下一篇: C++ Passing `this` into method by reference