通过引用或指针返回并检查是否为空
return by reference or pointer and check for null?
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()返回的指针是否为空(给定我知道这个类的结构)
- 你的设计需要被证明是安全的吗?
- 如果不是,那么
A::mutable_data()
的设计是否决定它不会返回null
?
如果(1),那么您应该投资于基于sat求解器的工具,它可以静态地测试您的代码不会访问无效内存。
如果(2),我建议您考虑契约式设计的概念——它是一个强大的概念。如果指定A::mutable_data()
的接口不返回null
,则返回null
将是A::mutable_data()
的设计缺陷。
返回一个空指针通常意味着"我没有任何数据给你"。如果类总是有数据,那么根据设计,函数将永远不会返回空指针。如果是这种情况,那么使用该函数的代码不需要检查空指针。这是该函数所做的保证之一:"我永远不会返回空指针"。
相关文章:
- 检查是否以特定精度给出双精度
- 地图计数确实很重要,或者只是检查是否存在
- 检查是否安装了 windows10 C++
- 模板化检查是否存在带有参数列表的类成员函数?
- 如何巧妙地编写两个函数——一个用于检查是否存在解决方案,另一个用于获取所有解决方案
- MPI:检查是否有任何进程已终止
- 给定一个大小为 N 的数组 S,检查是否可以将序列拆分为两个序列
- Vulkan 的传输队列系列功能和显卡支持:条件检查是否准确?
- 如何检查是否定义了固定宽度的整数
- 使用预处理指令检查是否包含标头?
- 在预处理器中检查 g++ 是否使用 -fopenmp 调用
- 将字符串转换为整数类型T,检查是否存在溢出
- C++编译时检查是否可以用某种类型的参数调用重载函数
- 检查是否至少设置了一点而不跳跃
- 在if条件下,右或左改变值的相等性检查是否有任何区别
- C++ 检查是否按下了键,而不是按住了
- 如何在 c++ 中解析包含整数的字符串并检查是否大于最大值
- 检查是否为质数大o
- 检查是否需要 utf8 转换并转换为 utf8
- 如何正确检查 c++ 是否存在注册表项?