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