18

ポインターからポインターへのポインターによって割り当てられた double 配列があります。

  // pointer to pointer
  int **x = new int *[5];   // allocation
  for (i=0; i<5; i++){
      x[i] = new int[2];
  }

  for (i=0; i<5; i++){      // assignment
      for (j=0; j<2; j++){
          x[i][j] = i+j;
      }
  }

  for (i=0; i<5; i++)   // deallocation
      delete x[i];
  delete x;

私はこれを使用してこれをやろうとしていますunique_ptr:

std::unique_ptr<std::unique_ptr<int>[]> a(new std::unique_ptr<int>[5]);
  for (i=0; i<5; i++)
      a[i] = new int[2];

しかし、それを言ってエラーが発生し続けましたno operator = matches these operands。ここで何が間違っていますか?

4

8 に答える 8

23

int*をに割り当てることはできませんstd::unique_ptr<int[]>。これがエラーの原因です。正しいコードは

      a[i] = std::unique_ptr<int[]>(new int[2]);

ただし、サイズが事前にわかっているかどうかに応じて、unique_ptr配列に使用することは非常にまれであるという piokuc は正しいです。std::vectorstd::array

//make a 5x2 dynamic jagged array, 100% resizable any time
std::vector<std::vector<int>> container1(5, std::vector<int>(2)); 
//make a 5x2 dynamic rectangular array, can resize the 5 but not the 2
std::vector<std::array<int, 2>> container1(5); 
//make a 5x2 automatic array, can't resize the 2 or 5 but is _really fast_.
std::array<std::array<int, 2>, 5> container;

これらはすべて、作成が簡単で、破棄する必要がないことを除いて、既に持っているコードと同じように初期化して使用できます。

于 2012-03-20T23:11:12.973 に答える
3
for (i=0; i<5; i++)   // deallocation
      delete x[i];
  delete x;

いいえ いいえ いいえ いいえ

delete [] x[i];
delete [] x;

//よ

于 2012-03-20T23:38:33.407 に答える
2

あなたのコードは、int の配列の配列を効果的に操作しています。

C++ では、通常は次のように実装します。

std::vector<std::vector<int> > x;

これは には適していませんunique_ptr。また、ポインタを使用してオブジェクトを動的にunique_ptr割り当てる必要はありません。unique_ptrの全体的なポイントはunique_ptr、ポインターの使用を排除し、オブジェクトの自動割り当てと割り当て解除を提供することです。

于 2012-03-20T20:24:08.413 に答える
2

配列を保持するために std::vector よりも std::unique_ptr (または boost::scoped_array と言う) を使用することが考えられる唯一の理由は、通常は適用できません...

1)すべての配列のサイズがわかっているかどうかに応じて、1つまたは2つのポインターに相当するメモリを節約します[大量の非常に小さな配列がない限り関係ありません]

2) C スタイルの配列または生のポインターを期待する関数に配列を渡すだけの場合は、より自然に適合するように感じるかもしれません。ただし、std::vector はシーケンシャル ストレージ上にあることが保証されているため、その(a.empty() ? nullptr : &a[0], a.size())ような関数に渡すことも 100% 正当です。

3) MSVC デバッグ モードの標準コンテナーはデフォルトで「チェック」されており、非常に低速です。これは、大規模なデータセットで科学的プログラミングを行う場合に煩わしい場合があります。

于 2013-02-25T01:12:39.010 に答える
0
for (i=0; i<5; i++)   // deallocation
      delete x[i];
delete x;

ここでよくある間違いです。x[i] は配列なので、最初に delete[] を使用して各配列を削除する必要があります。次に、delete[] を使用して int* の配列を削除できます。

正しい割り当て解除は次のようになります。

for (i=0; i<5; i++)   
      delete[] x[i]; //desallocate each array of int
delete[] x; //desallocate your array of int*
x = nullptr; //good practice to be sure it wont cause any dmg
于 2018-09-11T19:38:29.603 に答える