2012-04-24 85 views
1

我想可以肯定,这是没有错的:我初始化C++数组初始化,好的做法

double* lower = input->getLowerBox(); 

数组,其中功能getLowerBox()返回一些双*。这是对的吗?或者我shold初始化这样::

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

好的做法是使用矢量而不是数组。 – chris 2012-04-24 14:18:04

+5

它取决于getLowerBox()返回的内容以及返回的内容。顺便说一句,你正在分配单个数组元素,而不是在最后两种情况下初始化数组。 – 2012-04-24 14:18:25

+0

在最后一个代码块中,一个'std :: vector'或者一个'std :: array'可能 – Kos 2012-04-24 14:19:27

回答

4

两个步骤配方:

  1. 变化Input::getLowerBox()返回std::vector<double> const&
  2. 如果要修改返回值,使用复制和const参考,而不是
0

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

你的第一个片段不会创建一个新的数组,因此内存管理更重要。

例如:

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

将可能呈现input->getLowerBox()无效。或者是这样的:

double* lower = NULL; 
{ 
    Class input; 
    lower = input->getLowerBox(); 
} 
//... 

将使lower悬空指针,如果input清除在析构函数的数组的内容。

最后两个片段创建新的数组。这是更安全的国际海事组织,但也使用额外的内存。

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

+0

正确性取决于getLowerBox()的所有权语义,这取决于解决方案*可能不正确。说两者都是正确的,这是错误的。 – 2012-04-24 14:22:33

+0

@Als所以你说如果数组的所有权属于类,第一个变体是不正确的? – 2012-04-24 14:26:38

0

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

编辑:你可以发布getLowerBox()的定义,所以它更清楚你想要做什么?

0

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

根据实现的不同,它可能会返回一个您可以拥有的指针或一个指向内部静态的指针(坏但可能),所以您需要知道它在做什么,并通过保留指针或复制副本的阵列。

如果没有超过getLowerBox()控制,你知道它返回数组的大小,这将是一个合理的想法将它复制到一个向量

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

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

0

我肯定会与第一个由于多种原因。它更干净,避免了不必要的调用/变量创建等。只要确保输入的指针是在使用“ - >”;否则使用“。”。