为我将在std :: map中使用的对象数组分配和释放内存的正确方法

劳尼·利米尔兹(Rauni Lillemets)

我有一个多边形集合,这些多边形可以从数据库中检索出来,并希望存储在二进制树中以便快速访问。作为二叉树,我使用std :: map。

我创建了此解决方案,概述如下,但是我认为这是不正确的,因为我没有调用free()释放由malloc()分配的内存。

我的问题(问题):

  1. 如果我只需要插入和访问此映射的元素,则使用std :: map是否正确?我只想通过其ID快速找到几何。
  2. 在std :: map中,我存储指向几何的指针,而不是存储几何本身。这是一个好主意吗?在尝试存储几何图形本身之前,但后来我意识到std :: map会复制对象,从而造成了问题。
  3. 在方法ConvertSpatial2GPC(..)中,我创建了gpc_geometry对象,这些对象创建了引用,并在gpc_free_polygon(..)上发布了这些引用。但是我无法释放gpc_geometry对象本身,因为此时我没有对其的引用。

我使用以下结构:

typedef struct                      /* Polygon vertex structure          */
{
  double              x;            /* Vertex x component                */
  double              y;            /* vertex y component                */
} gpc_vertex;

typedef struct                      /* Vertex list structure             */
{
  int                 num_vertices; /* Number of vertices in list        */
  gpc_vertex         *vertex;       /* Vertex array pointer              */
} gpc_vertex_list;

typedef struct                      /* Polygon set structure             */
{
  int                 num_contours; /* Number of contours in polygon     */
  int                *hole;         /* Hole / external contour flags     */
  gpc_vertex_list    *contour;      /* Contour array pointer             */
} gpc_polygon;

typedef std::map<long, gpc_polygon*> layer;

我的工作流程如下:

  1. 从数据库加载项目
  2. 调用方法initializeLayer()返回一个图层(请参阅前面的typedef)
  3. ...使用图层...
  4. 调用方法freeLayer()释放该层使用的内存

用于初始化几何对象的代码:

layer initializeLayer() {
    //... database connection code

    //find the count of objects in database
    int count = ...

    //helper object for loading from database
    spatial_obj* sp_obj = NULL;

    //initialize a array to hold the objects
    gpc_polygon* gpc_objects;
    gpc_objects = (gpc_polygon*)malloc(sizeof(gpc_polygon) * count);

    layer myLayer;

    int i = 0;

    //... query database
    while(db.Fetch()) {
        id = db.GetLongData(0);
        db.GetSDO_Object(&sp_obj); //load from database
        db.ConvertSpatial2GPC(sp_obj, &gpc_mullad[i]); //convert polygon to GPC format
        //insert a pair (ID->pointer to the geometry)
        myLayer.insert(layer::value_type(id, &gpc_objects[i]);
        i++;
    }

    return layer;
}

释放层的代码:

void freeLayer(layer myLayer) {
    for (layer::iterator it = myLayer.begin(); it != myLayer.end(); ++it) {
        gpc_free_polygon(it->second); //frees the memory from this geometry object
    }
}

释放几何对象的代码:

void gpc_free_polygon(gpc_polygon *p)
{
    int c;

    for (c= 0; c < p->num_contours; c++) {
        FREE(p->contour[c].vertex);

    FREE(p->hole);
    FREE(p->contour);
    p->num_contours= 0;
}
劳尼·利米尔兹(Rauni Lillemets)

我认为我正在使事情变得更复杂。

我真的不需要std :: map来存储指针。相反,我可以从数据库中查询多边形,以便按ID对其进行排序。然后,我可以将多边形存储在静态结构(数组或向量)中。当我需要通过元素ID查找元素时,我将只使用二进制搜索算法来找到它(无论如何,这是对数时间,就像二进制树所使用的搜索算法一样)。

因此,我的方法initializeLayer()将返回一个数组或向量,而我将在程序末尾释放它们。

编辑:我发现我不必自己实现二进制搜索。为此有一个类:std :: binary_search。链接:二进制搜索算法

EDIT2:那就是我最终得到的结果:

对象结构

typedef struct {
    long id;
    gpc_polygon gpc_obj;
} object;

层结构

typedef std::vector<muld*> layer;

用于初始化几何对象的代码:

layer initializeLayer() {
    //... database connection code

    //find the count of objects in database
    int count = ...

    //helper object for loading from database
    spatial_obj* sp_obj = NULL;
    object* object_ptr = NULL;

    layer myLayer;
    myLayer.reserve(count);

    int i = 0;

    //... query database
    while(db.Fetch()) {
        id = db.GetLongData(0);
        db.GetSDO_Object(&sp_obj); //load from database

        object_ptr = new object;
        object_ptr->id = id;
        db.ConvertSpatial2GPC(sp_obj, &object_ptr->gpc_obj);
        myLayer.push_back(object_ptr);
        i++;
    }

    return layer;
}

释放层的代码:

void freeLayer(layer myLayer) {
    for(std::vector<int>::size_type i = 0; i != myLayer.size(); i++) {
        gpc_free_polygon(&myLayer[i]->gpc_obj);
        delete myLayer[i];
    }
}

进行二进制搜索的代码:

我发现std :: binary_search只返回是否找到对象。std :: lower_bound()来解救!

//Create empty object for searching
object* searched_obj = new obj;
object* found_obj = NULL;
searched_obj->id = id;
layer::iterator it;
it = std::lower_bound(myLayer.begin(), myLayer.end(), searched_obj, obj_comparer);
if(it != kiht.end()) {
    found_obj = *it;

    if(found_obj->id != id) {
        //Error!
    }
} else {
    //Error!
}
//Release memory
delete searched_obj;

比较对象的功能

bool obj_comparer(object *a, object  *b) {
    return a->id < b->id;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在 C++ 中为我自己的基于指针的数组分配内存的正确方法

来自分类Dev

在C ++中为高维数组分配动态内存的正确方法?

来自分类Dev

在C ++中为高维数组分配动态内存的正确方法?

来自分类Dev

我正在尝试使用malloc函数为数组分配内存,但是值未正确扫描。谁能解释?

来自分类Dev

如何在C ++中使用Calloc为3D数组分配内存

来自分类Dev

为结构数组分配内存我遇到错误

来自分类Dev

在Bash脚本中使用循环为数组分配变量

来自分类Dev

为链接列表数组分配内存

来自分类Dev

为全局多维数组分配内存

来自分类Dev

如何清除在C ++中为指针正确指向的数组分配的内存?

来自分类Dev

为包含指针引用的已分配内存的结构释放内存的正确方法

来自分类Dev

为动态分配的数组分配更多的内存

来自分类Dev

使用uint8_t为双数组分配内存

来自分类Dev

使用new为未签名的char数组分配内存失败

来自分类Dev

如果我为c中的数组分配内存,是否必须强制转换?

来自分类Dev

在C中为一维数组分配内存

来自分类Dev

为结构中的二维数组分配内存

来自分类Dev

为char数组分配动态内存

来自分类Dev

为2D数组分配内存

来自分类Dev

为连续的2D数组分配内存

来自分类Dev

什么时候在C ++中为数组分配内存?

来自分类Dev

动态为int的指针数组分配内存

来自分类Dev

在fgets中为结构数组分配内存

来自分类Dev

我们是否应该释放为std :: locale分配的资源

来自分类Dev

为数组分配空间

来自分类Dev

使用增强的 For 循环为数组分配新值

来自分类Dev

std :: unordered_map分配,插入和释放时间

来自分类Dev

使用数组分配内存

来自分类Dev

如何在Objective-C类中为数组分配内存?

Related 相关文章

热门标签

归档