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

标签 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() 返回的指针是否为空(假设我知道此类的结构)。就我个人而言,我认为我不必这样做,因为我知道存在一个返回 const 引用的辅助 api,因此我的指针永远不会为 null(我无法想象这个函数会返回 null 的场景,即使它不知何故确实返回 null,在这种情况下 const ref 版本的行为是什么)。或者我应该说我知道它是堆栈上现有对象的地址,所以它不能为空?这是思考或推理的正确方法吗?如果有人有其他想法,请给出一些示例代码。

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

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

最佳答案

do i have to check if the pointer returned by the mutable_data() is null or not (given that i know the structure of this class)

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

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

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

如果 (2),我建议您考虑按契约(Contract)设计的概念——它非常强大。如果 A::mutable_data() 的接口(interface)指定不返回 null,那么它返回 null 将是 的设计缺陷>A::mutable_data().

关于c++ - 通过引用或指针返回并检查是否为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17183075/

相关文章:

c++ - 从 winsock 数据中检测用户?

c++ - 如何在C++中将多维 vector 数据写入文件

javascript - ObservableArray 不反射(reflect)其在函数之外的值

java - 如何在 Java 中将对单个数组的所有引用更改为 null

c++ - qmake:等同于源/cpp 文件的 INCLUDEPATH?

C++ 使用来自其他命名空间的符号而不使它们可以从外部访问

C - 链表中的节点以某种方式修改,导致段错误

c - 具有内存映射 I/O 的 C 指针的奇怪行为

c++ - 队列数组指针 (C++)

arrays - 为什么我可以将此视为引用并将其视为标量来打印?