c ++数组初始化,很好的实践

时间:2012-04-24 14:14:45

标签: c++ arrays

我想确定这没有错:我用

初始化数组
 double* lower = input->getLowerBox();

其中函数getLowerBox()返回一些double *。这是对的吗?或者说我用这种方式初始化::

double* lower = new double[nbP];
for (int i=0;i<nbP;i++)
     lower[i]=input->getLowerBox()[i];

或避免多次调用getLowerBox,

double* lower = new double[nbP];
double* tmp = input->getLowerBox();
for (int i=0;i<nbP;i++)
     lower[i]=tmp[i];
delete[] tmp;

5 个答案:

答案 0 :(得分:4)

两步食谱:

  1. 更改Input::getLowerBox()以返回std::vector<double> const&
  2. 如果要修改返回的值,请使用副本,而使用const引用

答案 1 :(得分:0)

嗯,这取决于你想做什么。你需要一个新阵列吗?

您的第一个代码段不会创建新阵列,因此内存管理更为重要。

例如:

double* lower = input->getLowerBox();
delete[] lower;

可能会导致input->getLowerBox()无效。或类似的东西:

double* lower = NULL;
{
   Class input;
   lower = input->getLowerBox();
}
//...
如果lower清除析构函数中数组的内容,

会使input成为悬空指针。

最后两个片段创建新数组。它是更安全的IMO,但也使用额外的内存。

两者都是正确的,取决于你想做什么。无论您选择哪种,请务必完整记录。

答案 2 :(得分:0)

第一种方式很好。你将返回一个指向double的指针,我假设它与一个数组相关(如果没有,那么请纠正我)。通过这样做,您指向该数组的第一个元素,然后您可以只索引lower或使用指针算法来访问其他元素。

编辑:您能否发布getLowerBox()的定义,以便您更清楚自己要做什么?

答案 3 :(得分:0)

您是否有能力更改getLowerBox()?如果是这样,我会改变它,以便返回一个向量。

根据实现,它可能会返回一个你可以拥有的指针或一个指向内部静态的指针(坏但可能),所以你需要知道它在做什么,并通过保留指针或获取副本来相应地采取行动。数组分别。

如果您无法控制getLowerBox()并且您知道它返回的数组的大小,那么将它复制到向量是合理的想法

double* lower = input->getLowerBox(); 
vector<double> lowerV(lower, lower + N );

(其中N是数组的大小 - 顺便说一句,这只是来自内存,我还没有编译它。)

答案 4 :(得分:0)

出于多种原因,我肯定会选择第一个。它更干净,它避免了不必要的调用/变量创建等。如果您使用“ - &gt;”,请确保输入是指针;否则使用“。”。