ポインターのベクトルを削除しようとすると問題が発生します。
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;
ベクター全体から各要素を削除していますが、それでもアサートされます。私が間違っていることを教えてください。
前もって感謝します。
ポインターのベクトルを削除しようとすると問題が発生します。
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;
ベクター全体から各要素を削除していますが、それでもアサートされます。私が間違っていることを教えてください。
前もって感謝します。
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);
}
そして、new
onを使用するvector
のはまったく間違っています-単純なベクトルを使用してください。その中に - を入れるvector<float>
か、毎回 2 つの要素だけが必要な場合は、次のようなものを使用します。
struct f2 { float a; float b; };
vector<struct f2> v;
一般に、生の 所有ポインターを持つことはお勧めできません (カスタムの高性能で高度に特殊化されたデータ構造を定義する場合など、特別な場合を除きます)。
あなたのコードでは - 特別な場合を除いて -現代の C++11/14 ではnew
andへの明示的な呼び出しがあってはなりません。delete
あなたのコード サンプル スタイルは、Java やその他のガベージ コレクション ベースの参照セマンティクス ベースの言語スタイルに似ているようです。代わりに、C++ は値のセマンティクスを好む傾向があります(たとえば、prefer: MyClass x;
to を使用します。また、所有MyClass * px = new MyClass();
ポインターが本当に必要な場合は、またはのようなスマート ポインターを使用します)。std::shared_ptr
std::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
です。vector
vector
float*
//
// 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#1、row#2、...、row#N ):
indexInVector = columnIndex + rowIndex * Columns;
template <typename T> class Matrix {...};
これらはすべて、行列要素を読み書きするための適切なメソッドと、std::vector<T>
データ メンバーとしての包含を使用して、クラス テンプレートに適切にラップできます。