異なるシステム間でいくつかのコードを変換していますが、c++ベクトルに関して質問があります。
私がこのようなことをした場合:
ヘッダーファイル:
struct Vertex
{
float x;
float y;
float z;
}
struct submesh
{
Vertex *meshdata;
}
std::vector<submesh> meshes;
C ++ファイルのルーチンでは:
{
Vertex *data = new Vertex[1024];
submesh g;
g.meshdata = data;
meshes.push_back(g);
delete [] data;
}
困りますか?私の仮定では、ベクターは、削除を呼び出すと無効になったデータへのポインターを保持することになります。データが最初にコピーされるように、Vertexのコピーコンストラクターを作成する必要がありますか?
追加:
問題は、割り当てられたメモリへのポインタをstd :: vector <>に配置し、ローカルに割り当てられたデータをクリーンアップする方法に関係していました。基本的に、データをベクターにコピーして、コピーをクリーンアップできるようにするにはどうすればよいですか。
元のコードはDirectXにありました。iPhoneに移植しています。元のコードは、以下を使用してルーチンでサブメッシュをローカルに割り当てました。
{
ID3DXMesh* subMesh = 0;
D3DXCreateMesh(SubGrid::NUM_TRIS, SubGrid::NUM_VERTS, D3DXMESH_MANAGED, elems, gd3dDevice, &subMesh));
//
// ... do some magical things to submesh
//
SubGrid g;
g.mesh = subMesh;
g.box = bndBox;
mSubGrids.push_back(g);
}
ID3DXMeshをベクターに追加する方法を複製しようとしていますが、ルーチンでそのスコープを失います。
D3DXCreateMesh()にアクセスできないため、必要な頂点を割り当て、それらをベクトルにスローして、クリーンアップするだけだと思いました。
申し訳ありませんが、問題はデータのチャンクを割り当て、std :: vector <>にポインタを置き、ローカルに割り当てられたメモリをクリーンアップする方法です。:)
コピーコンストラクターはどこかに書かれなければならないと思いました。どこで、どのようにすればいいのかわからなかった。
サブグリッドは次のようになります。
struct SubGrid
{
ID3DXMesh* mesh;
AABB box;
// For sorting.
bool operator<(const SubGrid& rhs)const;
const static int NUM_ROWS = 33;
const static int NUM_COLS = 33;
const static int NUM_TRIS = (NUM_ROWS-1)*(NUM_COLS-1)*2;
const static int NUM_VERTS = NUM_ROWS*NUM_COLS;
};
そして、それらが追加されるベクトルは次のようになります。
std::vector<SubGrid> mSubGrids;