我正在不同系统之间转换一些代码,并且对c++ vector 有疑问。如果我做这样的事情:在头文件中: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 , vector 将保存一个指向不再有效的数据的指针。我是否需要为和编写副本构造函数,以便首先复制数据? 附加:问题更多与如何将指向已分配内存的指针放入std::vector 并仍然清除本地分配的数据有关。本质上,如何将数据复制到 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添加到 vector 中,然后在例程中失去它的作用域。由于我没有访问D3DXCreateMesh()的权限,因此我想我只需分配所需的顶点,将它们放入 vector 中,然后进行清理即可。抱歉,我想保留所有细节,因为问题只是我如何分配数据块,将指针放到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;};它们添加到的 vector 如下所示:std::vector<SubGrid> mSubGrids; 最佳答案 不需要时不要直接动态分配,在这种情况下就不需要。由于您要填充自己的子网格数据,而不是使用ID3DXMesh,因此该数据的容器应符合RAII。如果我对此进行编码,我将完全删除submesh类,而只需使用:// vector containing list of vertices.typedef std::vector<Vertex> SubMesh;然后,您的SubGrid类可以成为一个简单的容器,其中包含submesh集合作为其属性之一。我注意到您还为box对象提供了AABB类。您将继续将其保留在SubGrid中。我没有很多工作要在这里工作,因此我会逐步完善其中的一些内容,但需要注意以下内容:// a simple 3-value triplet of floatsstruct Vertex{ float x,y,z;};// a Submesh is an arbitrary collection of Vertex objects.typedef std::vector<Vertex> SubMesh;// I'm defining AABB to be an 8-vertex object. your definition// is likely different, but I needed something to compile with =)typedef Vertex AABB[8];class SubGrid{public: SubGrid() {}; // comparator for container ordering bool operator <(const SubGrid&); // submesh accessors void setSubmesh(const SubMesh& mesh) { submesh = mesh;} SubMesh& getSubmesh() { return submesh; } const SubMesh& getSubmesh() const { return submesh; } // box accessors AABB& getBox() { return box; } const AABB& getBox() const { return box;}private: SubMesh submesh; AABB box;};// arbitrary collection of SubGrid objectstypedef std::vector<SubGrid> SubGrids;将其添加到全局SubGrid集合g时,您有几种可能。您可以这样做:// declared globallySubgrids g;// in some function for adding a subgrid itemSubGrid subgrid;AABB& box = subgrid.getBox();SubBesh& submesh = subgrid.getSubmesh();// ... initialize your box and submesh data ...g.push_back(subgrid);但是您会在周围复制很多数据。要加强对内存的访问,您可以始终这样做:// push an empty SubGrid first, then set it up in-placeg.push_back(SubGrid());Subgrid& subgrid = *(g.back());AABB& box = subgrid.getBox();SubMesh& submesh = subgrid.getSubmesh();//... initialize your box and submesh data ...这将建立对刚刚添加到全局集合中的SubGrid的引用,然后允许您就地对其进行修改。这只是许多可能的设置选项之一。应该注意的是,如果您的工具链中包含C++ 11(并且如果您在MacOS或iOS上执行此操作,则可能会这样做,因为Apple LLVM 4.2的clang符合C++ 11的要求非常好)明智地使用 move-constructors 和 move-assignment-operators 可以提高效率。最重要的是,看不到new或delete。无论如何,我希望这能给您一些想法。关于c++ - 将指针插入C++ vector 并清理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14796670/ 10-11 16:08