1

我有一些疑问:我想测试在函数调用之前是否已经分配了一些数组,低和高。该函数从这个测试开始:

bool myMgr::compute(myInput *solvInput, double* low, double* high)
{
   if(high==NULL||low==NULL)
        return false;

   //...
}

我在测试什么,我测试对了吗?

谢谢并恭祝安康

4

5 回答 5

1

您正在测试这两个指针是否不为 NULL,如果堆分配器无法分配足够的内存,则将返回该指针,但除此之外您不能做出其他假设:

  • 它们可以是!= NULL,但由用户初始化: double* ptr = (double*)5;
  • 它们可能是也可能不是“数组”:您没有关于分配的元素数量的信息。
于 2012-07-10T10:18:17.717 回答
1

你提到分配。这是误导;通常的分配器从不返回空指针。std::bad_alloc如果没有足够的内存,它们会引发异常。

如果您提供某种可选行为,则使用这样的指针很有用;客户端代码可以传递一个空指针来指示它不需要您提供的功能。(当然,客户端代码可以自己进行测试,并且只有在两个指针不为空时才调用您的函数。哪种解决方案更可取很大程度上取决于上下文。)

于 2012-07-10T10:35:57.067 回答
0

是的,你所做的是正确的。但是您必须确保在声明期间(在调用方法中)已将指针初始化为 NULL - 否则,它们可能具有会通过此测试的垃圾值。

于 2012-07-10T10:18:50.257 回答
0

如果您有最新版本的 c++(来自 c++11),您应该使用nullptr而不是NULL

if(high==nullptr || low==nullptr)

而且您必须确保将指针设置为nullptr而不是NULL.

如果nullptr不可用,那么您正在做的事情很好,或者,您可以按照SingerOfTheFall在他的评论中写的那样做。

此外,您可以使用 user ,而不是使用数组并且必须依赖指针,std::vector这将允许您获得有关数组当前状态的更多信息,例如其当前大小。

于 2012-07-10T10:23:12.463 回答
0

您无法检查指针是否指向有效的东西。

相反,您可以将数组作为引用传递,这可以确保函数将至少接收初始化参数,但最好是使用向量:

compute(std::vector<myInput> &solvInput, std::vector<double> &low, std::vector<double> &high)

如果他们是 1:1 的话,甚至更好地在一个班级中分低

compute(std::vector<myInput> &solvInput, std::vector<minmax> &lowhigh)
于 2012-07-10T10:23:29.597 回答