通过引用或指针返回并检查是否为空

return by reference or pointer and check for null?

本文关键字:检查 是否 返回 引用 指针      更新时间:2023-10-16
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()返回的指针是否为空(给定我知道这个类的结构)。就我个人而言,我认为我不需要,因为我知道存在一个返回const引用的二级api,所以我的指针永远不会为空(我无法想象这个函数会返回null的场景,即使它以某种方式返回null,在这种情况下const ref的行为是什么)。或者我应该说我知道它是堆栈上现有对象的地址,所以它不能为空?这是正确的思考或推理方式吗?如果有人不这么认为,请给出一些示例代码。

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

通过引用返回的

不是我想要的。

我是否必须检查mutable_data()返回的指针是否为空(给定我知道这个类的结构)

一般来说,像"必须检查指针"这样的设计元素取决于以下两种情况之一:
  1. 你的设计需要被证明是安全的吗?
  2. 如果不是,那么A::mutable_data()的设计是否决定它不会返回null ?

如果(1),那么您应该投资于基于sat求解器的工具,它可以静态地测试您的代码不会访问无效内存。

如果(2),我建议您考虑契约式设计的概念——它是一个强大的概念。如果指定A::mutable_data()的接口不返回null,则返回null将是A::mutable_data()的设计缺陷。

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