【问题标题】:return by reference or pointer and check for null?通过引用或指针返回并检查是否为空?
【发布时间】:2013-06-19 04:49:35
【问题描述】:
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 引用返回。

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

【问题讨论】:

  • 它是你的代码,所以它是你的选择!请记住,如果方法是虚拟的,那么所有子类都需要遵守约定,否则您会遇到问题。
  • const vector&lt;int&gt; &amp;data() constvector&lt;int&gt; &amp;data()有问题吗?
  • 记住:如果你是A 的对象是完全构造的,那么A::x 也是完全构造的。 x 不能变成 NULL,因为它没有存储在其他地方,并且使用指针间接访问(而不是引用,因为引用不能变成 NULL)。
  • 一般来说,你需要确保指针不为空,然后再间接它们。一旦知道它不为空,就可以保留对它指向的对象的引用,以明确不需要进行更多检查。
  • @chris :我想更多地关注检查空指针的情况是多余的。

标签: c++ pointers reference protocol-buffers


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 在最后一段中,如果接口被指定为不返回空指针,那么返回空指针将是编码错误,而不是设计缺陷。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 2021-07-02
    相关资源
    最近更新 更多