我正在不同系统之间转换一些代码,并且我有一个关于 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;