我有一种加载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;
}


是什么原因引起的?我该如何解决呢?

编辑:扩展第二个示例

最佳答案

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

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

您可以使用OGRFeature::StealGeoemtry来获取所有权,也可以简单地删除delete geometry指令,因为DestroyFeature()函数仍然会处理它。

关于c++ - GDAL DestroyFeature()方法产生段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49855955/

10-09 13:12