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)
一般来说,像“必须检查指针”这样的设计元素取决于以下两件事之一:
- 您的设计是否需要证明是安全的?
- 如果不是,那么
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/