1

データのベクトルを作成したいのですが、そのサイズを設定し、その要素をサブ関数に入力したいと思います。これは、新しい演算子を使用するのに適切な時期ですか?それを行うためのより良い方法はありますか?適切な時期のようですが、C ++プログラマーが「new」の使用を最小限に抑える必要があるのはなぜですか?

int main()
{
    vector<double> *array1;
    vector<double> *array2;
    OtherArgs otherArgs;
    FillArrays(array1,array2,otherArgs);
    //Do other stuff 
    delete array1;
    delete array2;
}

void FillArrays(vector<double> *&array1, vector<double> *&array2, OtherArgs &otherArgs)
{
    int size=GetSize(otherArgs);
    array1 = new vector<double>(size);
    array2 = new vector<double>(size);
    //Other code to fill the arrays
}

ありがとうございました

4

2 に答える 2

7

元のサンプルが面倒な理由はいくつかあります。

  • delete呼び出しが保護されていないため、コードは例外に直面してメモリをリークします
  • FillArraysNULL以外の値が渡されるとvectory<double>、前の値が削除されなかったため、メモリリークが発生します。delete値がスタックに割り当てられている可能性があるため、必要な場合でも 確実に呼び出すことができませんでした。

これを行う最も簡単な方法は、スタック上の値を宣言し、その方法で参照によってそれらを渡すことです。

int main()
{
    vector<double> array1;
    vector<double> array2;
    OtherArgs otherArgs;
    FillArrays(array1,array2,otherArgs);
    //Do other stuff 
}

void FillArrays(vector<double> &array1, vector<double> &array2, OtherArgs &otherArgs)
{
    int size=GetSize(otherArgs);
    //Other code to fill the arrays
}

このvector<T>方法で宣言すると、は空のリストに初期化されます。その後、FillArraysメソッドは必要に応じてそれらを設定できます。

于 2012-05-30T18:53:20.253 に答える
3

いいえ、これは の特に悪い使い方ですnew

newdelete1を使用する必要がある場合は、ブックエンドとして使用してください。削除式は、新しい式と論理的に一貫したコンテキストにある必要があります。

したがって、newc-tor を使用している場合はdelete、d-tor を使用する必要があります。割り当て関数を使用している場合は、割り当て解除関数を使用newする必要deleteがあります。2 つの呼び出しは、一方が操作を開始し、もう一方が操作を終了することが明確になるように配置する必要があります。

これは、 と への呼び出しがnewdelete機能階層またはオブジェクト階層の同じ層に存在する必要があることを意味します。具体的にnewdelete、API コントラクトの一部としてではなく、実装の詳細として見なされるべきです。2

あなたの場合、新規と削除は完全に異なるコンテキストにあります。newは実装内にdeleteありますが、クライアントでは呼び出されます。これによりプログラミング エラーが発生します。

それを超えて、コードの新しいバージョン ( で空のベクトルを作成mainし、参照によって渡す) は、バージョンよりも単純で読みやすく、例外に対応していnewます。

いいえ、これは を使用する良い例ではありませんnewただし、これは、そうでない場合の優れた例です。


1 andを使用する必要はほとんどありません。動的割り当てが必要な場合は、コンテナにオブジェクトのコピーを保持させてください。newdelete

2std::shared_ptrなどは、この規則に違反しています。newdeleteは、特に契約の一部です。ポインター操作が存在する理由なので、これはおそらく問題ありません。newしかし、SO は、非ポインタを格納することに関するバグの共有を見てきましたshared_ptr

于 2012-05-30T19:00:16.253 に答える