2012-04-24 55 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

我肯定會與第一個由於多種原因。它更乾淨,避免了不必要的調用/變量創建等。只要確保輸入的指針是在使用「 - >」;否則使用「。」。