我有一些疑问:我想测试在函数调用之前是否已经分配了一些数组,低和高。该函数从这个测试开始:
bool myMgr::compute(myInput *solvInput, double* low, double* high)
{
if(high==NULL||low==NULL)
return false;
//...
}
我在测试什么,我测试对了吗?
谢谢并恭祝安康
您正在测试这两个指针是否不为 NULL,如果堆分配器无法分配足够的内存,则将返回该指针,但除此之外您不能做出其他假设:
!= NULL
,但由用户初始化: double* ptr = (double*)5;你提到分配。这是误导;通常的分配器从不返回空指针。std::bad_alloc
如果没有足够的内存,它们会引发异常。
如果您提供某种可选行为,则使用这样的指针很有用;客户端代码可以传递一个空指针来指示它不需要您提供的功能。(当然,客户端代码可以自己进行测试,并且只有在两个指针不为空时才调用您的函数。哪种解决方案更可取很大程度上取决于上下文。)
是的,你所做的是正确的。但是您必须确保在声明期间(在调用方法中)已将指针初始化为 NULL - 否则,它们可能具有会通过此测试的垃圾值。
如果您有最新版本的 c++(来自 c++11),您应该使用nullptr
而不是NULL
:
if(high==nullptr || low==nullptr)
而且您必须确保将指针设置为nullptr
而不是NULL
.
如果nullptr
不可用,那么您正在做的事情很好,或者,您可以按照SingerOfTheFall在他的评论中写的那样做。
此外,您可以使用 user ,而不是使用数组并且必须依赖指针,std::vector
这将允许您获得有关数组当前状态的更多信息,例如其当前大小。
您无法检查指针是否指向有效的东西。
相反,您可以将数组作为引用传递,这可以确保函数将至少接收初始化参数,但最好是使用向量:
compute(std::vector<myInput> &solvInput, std::vector<double> &low, std::vector<double> &high)
如果他们是 1:1 的话,甚至更好地在一个班级中分低
compute(std::vector<myInput> &solvInput, std::vector<minmax> &lowhigh)