我正在不同系统之间转换一些代码,我对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;
}
我会遇到麻烦吗?我的假设是,当我在其上调用 delete 时,向量将保存指向不再有效的数据的指针。我是否需要为 Vertex 编写复制构造函数,以便首先复制数据?
其他
问题更多的是如何将指向已分配内存的指针放入std :: vector&lt;&gt;并仍然清理本地分配的数据。基本上,如何将数据复制到矢量中,这样我仍然可以清理我的副本。
原始代码在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&lt;&gt ;,然后清理本地分配的记忆。 :)
我假设必须在某处写一个复制构造函数。只是不知道在哪里或如何。
子网格看起来像这样:
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;
答案 0 :(得分:1)
是的,当然,vector会有一个指向已删除内存的指针。你需要的是:
为submesh
(不是Vertex
)创建复制构造函数。或
将submesh
更改为包含顶点数组(不仅仅是指针)。
复制构造函数可以像这样完成:
struct submesh
{
Vertex *meshdata;
unsigned meshsize;
submesh(Vertex* v = 0, unsigned s= 0) : meshdata(v), meshsize(s){}
submesh(const submesh& s)
{
if(meshdata) /*we have stored data, delete it.*/ delete(meshdata);
meshdata = new Vertex[s.meshsize];
meshsize = s.meshsize;
memcpy(meshdata, s.meshdata, sizeof(Vertex) * meshsize);
}
};
当然,建议使用unique_ptr(如果使用c ++ 11)或auto_ptr用于旧c ++。尽可能避免内存管理的噩梦。
检查How to avoid memory leaks when using a vector of pointers to dynamically allocated objects in C++?
答案 1 :(得分:1)
您的代码在单线程应用程序中看起来很好。您的代码只分配data
内存一次,delete [] data
一次。
我是否需要为Vertex编写复制构造函数以便首先复制数据?
您的代码显示清晰,meshes
指向仅分配data
。如果您打算在致电data
时复制meshes.push_back(g)
,那么您的代码就不会按照您的意图行事。
您可能希望改为使用std::vector
:
struct submesh
{
std::vector<Vertex> meshdata;
}
vector<submesh> meshes;
void Func()
{
meshes.emplace_back(submesh());
meshes.at(0).meshdata.resize(100);
}
STL容器使用RAII个用法,它会自动为你管理内存释放。