0

を使用して多次元配列を割り当てるときはnew、次のようにしています。

void manipulateArray(unsigned nrows, unsigned ncols[])
{
  typedef Fred* FredPtr;
  FredPtr* matrix = new FredPtr[nrows];

  for (unsigned i = 0; i < nrows; ++i)
    matrix[i] = new Fred[ ncols[i] ];

}

wherencols[]には、 の各要素の長さmatrixnrowsの要素の数が含まれmatrixます。

にデータを入力したい場合はmatrix

  for (unsigned i = 0; i < nrows; ++i) {
      for (unsigned j = 0; j < ncols[i]; ++j) {
        someFunction( matrix[i][j] );

しかし、私は非常に注意するように言っているC++ FAQを読んでいます。各行をNULL最初に初期化する必要があります。次に、trycatch行の割り当てを行う必要があります。なぜこれがすべてなのか、私には本当にわかりません。私は常に(最初はそうですが)上記のコードでCスタイルで初期化しています。

FAQ こうしてほしい

void manipulateArray(unsigned nrows, unsigned ncols[])
{
  typedef Fred* FredPtr;

  FredPtr* matrix = new FredPtr[nrows];

  for (unsigned i = 0; i < nrows; ++i)
    matrix[i] = NULL;

  try {
    for (unsigned i = 0; i < nrows; ++i)
      matrix[i] = new Fred[ ncols[i] ];

    for (unsigned i = 0; i < nrows; ++i) {
      for (unsigned j = 0; j < ncols[i]; ++j) {
        someFunction( matrix[i][j] );
      }
    }

  }
  catch (...) {
    for (unsigned i = nrows; i > 0; --i)
      delete[] matrix[i-1];
    delete[] matrix;
    throw;    // Re-throw the current exception
  }

}

1/ 常に慎重に初期化するのは、とてつもないことですか、それとも非常に適切ですか?

2/非組み込み型を扱っているため、このように進めていますか? コードは (同じレベルの注意を払って) と同じdouble* matrix = new double[nrows];でしょうか?

ありがとう

編集

回答の一部はFAQ の次の項目にあります

4

2 に答える 2

2

このように注意する理由は、これらの割り当てのいずれかが失敗した場合、または Fred コンストラクターがスローした場合にメモリ リークが発生するためです。コールスタックの上位で例外をキャッチした場合、割り当てたメモリへのハンドルがないため、リークが発生します。

1) その通りですが、一般的に、メモリ リークから保護するためにこれだけの手間をかける場合はstd::vector、and std::shared_ptr(など) を使用してメモリを管理することをお勧めします。

2) 組み込み型の場合も同じですが、少なくともスローされる唯一の例外はstd::bad_alloc、割り当てが失敗した場合です。

于 2013-03-15T14:07:01.067 に答える
0

ターゲットプラットフォームとシステムの要件によって異なると思います。安全性が最優先事項である場合、および/またはメモリが不足する可能性がある場合は、いいえ、これは大げさではありません。ただし、安全性にあまり関心がなく、システムのユーザーに十分な空きメモリがあることがわかっている場合は、これも行いません。

ビルトインタイプを使用するかどうかには依存しません。FAQソリューションは、行へのポインタをnullにして、例外が発生した場合に、すでに作成されている行のみが削除されるようにします(ランダムなメモリ位置は削除されません)。

そうは言っても、これにはSTLコンテナを使用する必要があるというR.MartinhoFerndandesのコメントを2番目にしかできません。あなた自身の記憶を管理することは退屈で危険です。

于 2013-03-15T14:03:58.333 に答える