2011-12-27 7 views
1

私は以下の機能を持っています。これは単なるコンストラクタです。それは、2次元浮動ポインタ配列のためにメモリを割り当てることです。私はこの配列をvectorインスタンスに追加するかどうか、配列の元の初期化を削除するかどうかを知りたい場合は、ベクトル内の配列も削除しますか?コードはちょうど壊れてベクターにプッシュされた配列がメモリを失うため、削除されますか?

Evaluator::Evaluator(int row, Column col) { 
    this->verticies = new std::vector(); 

    float* matrix = NULL; 

    switch(col) { 
    case ONE: 
     matrix = new float[row][1]; 
     break; 
    case TWO: 
     matrix = new float[row][2]; 
     break; 
    case THREE: 
     matrix = new float[row][3]; 
     break; 
    case FOUR: 
     matrix = new float[row][4]; 
     break; 
    } 

    this->verticies->push_back(matrix); 

    delete matrix; 
} 
+0

なぜ私は1つの場所でベクトルを使用し、もう1つの配列でベクトルを使用するのが不思議ですか? – dasblinkenlight

+0

私はコンテナに行列を格納しています。トリプル次元配列を使用する方が理にかなっていますか? – zeboidlund

+0

入れ子になったベクトルを使用する方が意味があると思います。深いネスティングの醜い構文と戦うためには、ベクトルの中のベクトルを行列としてtypedefし、それから行列のベクトルを作ります。 – dasblinkenlight

答えて

5

は、ここでは、コードです。 new[]で割り当てることはできず、deleteで割り当てを解除することはできません。実装は、異なるアロケータで全く異なるロジックを使用することができます。

希望するものはdelete[] matrix;です。

質問した質問については、あなたがベクターに保存した内容によって異なります。ベクトルにポインタを格納し、同じポインタ上にdelete[]を呼び出した場合、そのベクトルは無効なポインタを保持します。ああ。ベクトルがオブジェクト自体を保持している場合は、削除したオブジェクトと同じ値の新しいオブジェクトを作成したので、ベクトルはまだ問題ありません。

あなたのコードはコンパイルできませんし、ベクターの完全な型が何であるかを明確にしていないので、言い難いです。また、スマート(または参照カウント)ポインタを使用する必要があります。

0

matrixを削除すると、ベクターにプッシュしたポインタのコピーが無効になります。これらのポインタを使用しようとすると、プログラムがクラッシュする可能性があります。

関連する問題