1

簡略化することを検討しているこのコードスニペットがあります。

if (numberOfResults > 1)
{

    trackResult_ = new TrackResult[numberOfResults];
    for (int i=0; i < numberOfResults; i++)
        {
            // Make a deep copy
            TrackResult tempResult = result[i];
            TrackResult * clone  = new TrackResult(tempResult);
            trackResult_[i]  = *clone;
        }

    storeJointResults(trackResult_, numberOfResults);
}
else
{
    trackResult_ = new TrackResult(*result);
}

(私には「選択の余地はありません」が、ここでは単純な動的配列を使用します。私の職場では、ベクトルは「複雑すぎる」と見なされます)

私は私が逃げることができるかどうか疑問に思っています

// even if we just have one result, we init an array size of one
trackResult_ = new TrackResult[numberOfResults];

しかし、私はいくつかの点で結果の数をチェックし、それに応じて行動しています

if (numberOfResults_ == 1)
{
   velocity = trackResult_.velocity;
}

それらのコードはまだ機能しますか?そうでない場合、なぜですか?

4

4 に答える 4

6

サイズ1の配列は、特別な場合である必要はありません。

動的配列を割り当てると、最初の要素へのポインターが与えられます。配列のサイズが1の場合、これは、オブジェクトの単一のインスタンスを割り当てただけとほとんど区別がつきません。

を変更した場合は、特殊なケースの使用法が機能します。->ただし、特別なケースではなく、trackResult_[0].velocityを使用することをお勧めします。

于 2009-11-11T11:43:58.847 に答える
3

いいえ、言うかどうかに応じて、正しいスカラーdeleteまたは配列に一致することを確認する必要があります。delete[]new TrackResult[n];new TrackResult;

また、これにより、ループの反復ごとにメモリリークが発生します。

 TrackResult tempResult = result[i];
 TrackResult * clone  = new TrackResult(tempResult);
 TrackResult_[i]  = *clone;
于 2009-11-11T11:37:40.123 に答える
3

ベクトルはどのように複雑すぎますか?どちらかといえば、コードを単純化してください。

于 2009-11-11T12:15:05.550 に答える
1

を使用して、Alexに同意します。ポインターの演算子も私の推奨スタイルではないので、これらの他のポイントはとにかく変更する必要があります。したがって、言及するコードの一部を単純化することを思いとどまらせることはありません。

于 2009-11-11T11:47:07.657 に答える