将指针推送到c ++向量和清理

时间:2013-02-10 10:15:01

标签: c++ pointers memory-leaks vector push-back

我正在不同系统之间转换一些代码,我对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;

2 个答案:

答案 0 :(得分:1)

是的,当然,vector会有一个指向已删除内存的指针。你需要的是:

  1. submesh(不是Vertex)创建复制构造函数。或

  2. submesh更改为包含顶点数组(不仅仅是指针)。

  3. 复制构造函数可以像这样完成:

    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个用法,它会自动为你管理内存释放。