1
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 的场景,即使它不知何故返回null,在这种情况下const ref版本的行为是什么)。或者我应该说我知道它是堆栈上现有对象的地址,所以它不能为空?这是思考或推理的正确方法吗?如果有人认为另一种方式,请给出一些示例代码。

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

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

4

2 回答 2

1

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

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

  1. 您的设计是否需要可证明是安全的?
  2. 如果不是,那么设计是否A::mutable_data()规定它不会返回null

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

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

于 2013-06-19T04:58:47.273 回答
0

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

于 2013-06-19T12:04:08.253 回答