GDAL DestroyFeature() 方法产生分割错误



我有一个加载OGRFeature并从中提取数据的方法。但是,当我调用方法OGRFeature::DestroyFeature()释放内存时,出现分段错误。

void Class::processFeatures() {
    OGRFeature* feature;
    feature = layer->GetNextFeature();
    while( feature != NULL ) {
        handleGeometries(); //Handling Geometries
        doY(); //Handling Fields
        OGRFeature::DestroyFeature(feature);
        feature = layer->GetNextFeature();
    }
}
void Class::handleGeometries() {
    OGRGeometry* geometry = feature->GetGeometryRef();
    //Some handling code
    delete geometry;
}

如果我排除DestroyFeature,代码将运行并保存信息。此示例确实有效。

#include "gdal.h"
#include "gdal_priv.h"
#include <ogrsf_frmts.h>
int main()
{
    GDALAllRegister();
    GDALDataset* map;
    map = (GDALDataset*) GDALOpenEx("shape.shp",GDAL_OF_VECTOR,NULL,NULL,NULL);
    if (map)
    {
        OGRLayer* layer = map->GetLayer(0);
        OGRFeature* feature;
        feature = layer->GetNextFeature();
        while( feature != NULL ) {
            OGRFeature::DestroyFeature(feature);
            feature = layer->GetNextFeature();
        }
        GDALClose(map);
    }
    return 0;
}

是什么导致了问题?我将如何解决它?

编辑:第二个示例展开

这个答案是在对原始问题进行一系列评论/编辑之后得出的,这些评论/编辑导致了这个结论:

在 handleGeoemtry(( 方法中删除几何指针会导致调用 DestroyFeature() 函数时内存冲突,因为几何OGRFeature::GetGeometryRef()返回对对象的引用,但不会将所有权转移给调用方。

您可以使用OGRFeature::StealGeoemtry获取所有权,或者简单地删除delete geometry指令,因为DestroyFeature()函数无论如何都会处理它。

相关内容

  • 没有找到相关文章

最新更新