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