Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ GDAL DestroyFeature()方法产生分段错误_C++_Memory Leaks_Segmentation Fault_Gdal - Fatal编程技术网

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

C++ GDAL DestroyFeature()方法产生分段错误,c++,memory-leaks,segmentation-fault,gdal,C++,Memory Leaks,Segmentation Fault,Gdal,我有一个加载OGRFeature并从中提取数据的方法。 然而,当我调用OGRFeature::DestroyFeature方法来释放内存时,我得到了一个分段错误 void Class::processFeatures() { OGRFeature* feature; feature = layer->GetNextFeature(); while( feature != NULL ) { handleGeometries(); //Handling

我有一个加载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;
}
如果排除该功能,代码将运行并保存信息。这个例子确实有效

#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方法中的几何体指针会导致内存冲突,因为geometry OGRFeature::GetGeometryRef返回对对象的引用,但不会将所有权转移给调用方


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

你在for循环中使用这个特性做什么?您是否尝试过测试功能指针是否不为null?我已经使用while循环和GetNextFeature测试了,但是这个问题仍然存在。当我开始没有想法时,我将该功能添加到了内部。在代码中是否有一行代码,您可以在循环之前从层中检索其他资源,然后销毁它们?在加载到GDALDataset之后,我会做的第一件事是什么。在包含代码之后,我关闭GDALDataset并继续保存数据。好的,不要删除从要素中获得的几何图形,因为它们仍然属于要素本身,并且将随要素一起销毁。查看GetGeometryRef的文档,我认为您正在使用该api。如果确实需要,请使用“窃取几何体”获取几何体的所有权。否则,请删除删除指令并检查其是否有效。