1

これが間違っていないことを確認したいと思います:私は配列を初期化します

 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;
4

5 に答える 5

4

2 ステップのレシピ:

  1. Input::getLowerBox()戻るに変更std::vector<double> const&
  2. 戻り値を変更する場合はコピーを使用し、const代わりに参照を使用します
于 2012-04-24T14:21:10.910 に答える
0

まあ、それはあなたが何をしたいかによります。新しいアレイが必要かどうか。

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

例えば:

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

無効になる可能性がありますinput->getLowerBox()。または次のようなもの:

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

デストラクタで配列の内容をクリアするlowerと、ダングリング ポインタが作成されます。input

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

やりたいことに応じて、どちらも正しいです。どちらを選択する場合でも、必ず完全に文書化してください。

于 2012-04-24T14:16:47.027 に答える
0

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

于 2012-04-24T14:46:44.657 に答える
0

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

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

于 2012-04-24T14:17:14.387 に答える
0

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

実装によっては、所有できるポインターまたは内部静的 (悪いが可能性あり) へのポインターが返される可能性があるため、それが何をしているのかを知り、ポインターを保持するか、配列のコピーをそれぞれ取得することによって、それに応じて行動する必要があります。 .

制御できずgetLowerBox()、返される配列のサイズがわかっている場合は、それをベクターにコピーするのが合理的な考えです。

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

N配列のサイズはどこですか-ところで、これはメモリからのものであり、コンパイルしていません。)

于 2012-04-24T14:34:45.160 に答える