3

ポインターのベクトルを削除しようとすると問題が発生します。

std::vector<float*> *v;

v = new std::vector<float*>;
v->assign(2, new float[2]);

for (int i = 0; i < 2; ++i)
{
    delete[] v->at(i);
}
delete v;

ベクター全体から各要素を削除していますが、それでもアサートされます。私が間違っていることを教えてください。

前もって感謝します。

4

3 に答える 3

1

THEv->assign(2, new float[2])は次と同じことを行います:

float *f = new float[2];
for(int i = 0; i < 2; i++)
   v->push_back(f);

もちろん、それはあなたが望むものではない可能性が最も高いです - あなたはおそらく望むでしょう:

for(int i = 0; i < 2; i++)
{
   float *f = new float[2];
   v->push_back(f);
}

そして、newonを使用するvectorのはまったく間違っています-単純なベクトルを使用してください。その中に - を入れるvector<float>か、毎回 2 つの要素だけが必要な場合は、次のようなものを使用します。

struct f2 { float a; float b; };
vector<struct f2> v;
于 2013-09-20T09:57:10.733 に答える
1

一般に、生の 所有ポインターを持つことはお勧めできません (カスタムの高性能で高度に特殊化されたデータ構造を定義する場合など、特別な場合を除きます)。

あなたのコードでは - 特別な場合を除いて -現代の C++11/14 ではnewandへの明示的な呼び出しがあってはなりません。delete

あなたのコード サンプル スタイルは、Java やその他のガベージ コレクション ベースの参照セマンティクス ベースの言語スタイルに似ているようです。代わりに、C++ は値のセマンティクスを好む傾向があります(たとえば、prefer: MyClass x;to を使用します。また、所有MyClass * px = new MyClass();ポインターが本当に必要な場合は、またはのようなスマート ポインターを使用します)。std::shared_ptrstd::unique_ptr

// Your original code:
//
//   std::vector<float*> *v;
//   v = new std::vector<float*>;
//
// Not good, since:
// 
// 1. You have a std::vector of owning pointers
//    (std::vector<float *>)
//
// 2. You have a raw owning pointer for the containing std::vector itself
//    (v = new std::vector<....>)
//

コードを記述するより現代的で正しい方法は、(生の所有ポインターの代わりに) のを使用することvectorです。vectorvectorfloat*

//
// Vector of vectors (i.e. 2D matrix), allocated on the stack
// Note: no raw owning pointers here.
//
vector<vector<float>> v;

次に、 usestd::vector::push_back()またはその他のstd::vectorメソッドを使用して、ベクターを設定できます。


2D マトリックスのより高性能でオーバーヘッドの少ない代替手段として、単一の 1D を使用し、サイズの単一の1D連続ベクトルで 2D マトリックスのコンテンツをstd::vector線形できます。Rows * Columns

vector<float> matrix;
matrix.resize( Rows * Columns );

また、 position(rowIndex, columnIndex)の要素にアクセスするには、次のような式を使用できます (行列要素を行ごとに格納する場合、つまり、 row#1row#2、...、row#N ):

indexInVector = columnIndex + rowIndex * Columns;

template <typename T> class Matrix {...};これらはすべて、行列要素を読み書きするための適切なメソッドと、std::vector<T>データ メンバーとしての包含を使用して、クラス テンプレートに適切にラップできます。

于 2013-09-20T10:17:44.183 に答える