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

时间:2018-04-16 11:16:13

标签: c++ memory-leaks segmentation-fault gdal

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

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

编辑:扩展的第二个例子

1 个答案:

答案 0 :(得分:1)

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

在调用OGRFeature::GetGeometryRef()函数时,删除handleGeoemtry()方法中的几何指针是导致内存违规的原因,因为几何OGRFeature::StealGeoemtry返回对象的引用但不转移所有权给来电者。

您可以使用delete geometry获取所有权,或者只需删除DestroyFeature()指令,因为START -> resmon.exe函数无论如何都会处理它。