2012-04-24 12 views
1

私は、これは間違っていないことを確認してくださいしたいと思います:私はC++配列の初期化、良い練習

double* lower = input->getLowerBox(); 

どこ機能getLowerBox(で配列を初期化すること)*一部のdoubleを返します。それが正しいか?それとも、私はこの方法を初期化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

+5

'getLowerBox()'が返すものと返されるものの所有権によって異なります。 Btw、最後の2つのケースで配列を初期化していない個々の配列要素を割り当てています。 –

+0

一般的な '' std :: vector'や、 'std :: array'おそらく – Kos

答えて

4

2つのステップのレシピ:

  1. 変更Input::getLowerBox()
0

まあ、それはあなたが何をしたいかに依存します。新しい配列が必要かどうか

最初のスニペットでは新しい配列が作成されないため、メモリ管理がより重要になります。例えば

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

はおそらく無効input->getLowerBox()をレンダリングします。か何かのように:inputはデストラクタでの配列の内容をクリアした場合

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

は、lowerダングリングポインタになるだろう。

最後の2つのスニペットが新しい配列を作成します。より安全なIMOですが、余分なメモリも使用します。

あなたのやりたいことに応じてどちらも正しいです。どちらを選んでも、完全に文書化してください。

+0

正確性は、解決策*が間違っている可能性があることに応じて、 'getLowerBox()'の所有権の意味に依存します。両方が正しいと言うのは間違いです。 –

+0

@Alsなので、配列の所有権がクラスに属する場合、最初の変種は間違っていますか? –

0

最初の方法は問題ありません。私は配列に関連していると仮定しているダブルへのポインタを返すつもりです(そうでなければ、私を修正してください)。これを行うことで、その配列の最初の要素を指しているだけで、lowerをインデックスするか、ポインタ演算を使用して他の要素にアクセスすることができます。

編集:getLowerBox()の定義を投稿して、それであなたがしようとしていることがより明確になりますか?

0

代わりにあなたが戻り値を変更したい場合はコピーを使用し、const参照std::vector<double> const&

  • を返すために、あなたは能力を持っていますか変更するにはgetLowerBox()?もしそうなら、私はベクトルを返すように変更します。

    実装によっては、自分が所有できるポインタや内部の静的なポインタ(悪いですが可能なもの)が返される可能性があります。そのため、ポインタを保持したり、コピーを取ったりして配列のそれぞれの配列。

    あなたはgetLowerBox()を制御することはできません、あなたはそれを返し、配列の大きさを知っていれば、それは合理的な考えではNはの大きさである

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

    (ベクトルにコピーします配列 - これはメモリからのものですが、私はそれをコンパイルしていません)。

  • 0

    私は間違いなく複数の理由から最初のものと一緒に行きます。よりクリーンで、不要な呼び出しや変数の作成などを避けることができます。「 - >」を使用している場合は、入力がポインタであることを確認してください。それ以外の場合は "。"を使用します。