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()
函数无论如何都会处理它。
我有一个方法可以加载 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()
函数无论如何都会处理它。