1

STLベクトルを使用して3x2行列を作成するための非常に単純なコードを作成しようとしています。
これは私が持っているものです:

#include <vector>
using namespace std;

int main ()
{

  int i;

  vector<int> * x = new vector<int> [3];

  for (i = 0; i < 3; i++)
       x[i] = vector<int> (2); 

  delete x;

  return 0;

}

問題は、プログラムを実行するたびにクラッシュすることです。削除すると正常にdelete x動作しますが、メモリリークが発生する可能性があります。

これはおそらくマトリックスを作成するための最良の方法ではなく、そこには選択肢の大隊があることを私は知っていますが、上記のプログラムが毎回クラッシュする理由を知りたいだけです。

また、すべての出現箇所vector<int>をsayに置き換えるとint、すべて正常に動作します。

4

4 に答える 4

10

動的に割り当てられた配列を破棄するには、 ではなくを使用する必要があります。delete[]delete

これでコードは機能しますが、最適なソリューションではありません。次のプログラムは同じことを行いますが、より簡潔で安全です。

#include <vector>

int main ()
{
  std::vector<std::vector<int>> x(3, std::vector<int>(2));
}
于 2012-08-16T14:04:46.503 に答える
4

"array" を使用しているnewため、次の場合も同じものが必要ですdelete

delete[] x;
//....^^

ここでの使用delete x;は未定義の動作であるため、何が起こる可能性があります。あなたのプログラムがクラッシュするのは幸運です:)


本当に正当な理由がない限り、これを行わないでください。あなたが持っているかもしれません

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

次に、コードは次のようになります。

std::vector< std::vector< int > > x( 3 );
for( unsigned int ii = 0; ii < x.size(); ++ii )
{
    x[ ii ].resize( 2 );
}

あるいは:

std::vector< std::vector< int > > x( 3, std::vector< int >( 2 ) );

私はこれを次のようにします:

typedef std::vector< int > SomeLogicalName; // or just IntVector
std::vector< SomeLogicalName > x( 3, SomeLogicalName( 2 ) );
于 2012-08-16T14:03:08.300 に答える
3

delete []動的に割り当てられた配列があるため、を使用する必要があります。ベクトルを持っているという事実は、それとは何の関係もありません。

を使用すると、コードを大幅に簡素化できますvector<vector<int>>

vector<vector<int>> v(3); // holds three empty vector<int>

あるいは

vector<vector<int>> v(3, std::vector<int>(2)); // holds 3 size 2 vector<int>
于 2012-08-16T14:03:53.520 に答える
0

すべてnewのニーズdelete

すべてnew []のニーズdelete []

于 2012-08-16T14:03:59.027 に答える