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

时间:2013-06-19 04:49:36

标签: c++ pointers reference protocol-buffers

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容器),但是我仍然需要进行空检查每次我想使用mutable api,因为它们总是通过指针或const引用返回。

通过引用返回并不是我想要的。

2 个答案:

答案 0 :(得分:1)

  

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

通常,“必须检查指针”等设计元素取决于以下两种情况之一:

  1. 您的设计是否需要证明安全?
  2. 如果没有,那么A::mutable_data()的设计是否会指示它不会返回null
  3. 如果(1),那么你应该投资那种基于SAT求解器的工具,它可以静态地测试你的代码不会访问无效的内存。

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

答案 1 :(得分:0)

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