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()返回的指针是否为null(假设我知道这个类的结构)。我个人认为我不必,因为我知道存在一个辅助api,它返回一个const引用,所以我的指针永远不会为null(我无法想象这个函数会返回null的情况,即使它不知怎的,它确实返回null,在那种情况下const ref版本的行为是什么)。或者我应该说我知道它在堆栈上的现有对象的地址,所以它不能为空?这是思考或推理这个的正确方法吗?如果有人想到另一种方式,请提供一些示例代码。
对于生产代码中更常见的情况场景:如果我使用协议缓冲区,我已经知道我的消息模板的生成代码(例如:重复字段,就像stl容器),但是我仍然需要进行空检查每次我想使用mutable api,因为它们总是通过指针或const引用返回。
通过引用返回并不是我想要的。
答案 0 :(得分:1)
我必须检查mutable_data()返回的指针是否为null(假设我知道这个类的结构)
通常,“必须检查指针”等设计元素取决于以下两种情况之一:
A::mutable_data()
的设计是否会指示它不会返回null
?如果(1),那么你应该投资那种基于SAT求解器的工具,它可以静态地测试你的代码不会访问无效的内存。
如果(2),我建议您考虑合同设计的概念 - 它是一个强大的概念。如果指定A::mutable_data()
的接口不返回null
,那么返回null
将是A::mutable_data()
中的设计缺陷。
答案 1 :(得分:0)
返回空指针通常意味着“我没有任何数据给你”。如果类总是有数据,那么,按照设计,函数永远不会返回空指针。如果是这种情况,那么使用该函数的代码不需要检查空指针。这是该函数的一个保证:“我永远不会返回空指针”。