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

GDAL DestroyFeature() method produces segmentation fault

我有一个方法可以加载 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;
}

导致问题的原因是什么?我该如何解决?

编辑:第二个例子展开

这个答案是在 comments/edits 对导致这个结论的原始问题的一系列 comments/edits 之后得出的:

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

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