2 votos

OGRFeature::DestroyFeature falla

Estoy utilizando OGR para leer características de un archivo shape; cuando la característica se destruye estoy recibiendo un error 0xC0000005: Violación de acceso al leer la ubicación 0xffffffffffff.

Esta sección del código parece inútil, pero es una simplificación de una sección mayor que muestra dónde se produce el error. He eliminado las líneas de código que podrían interferir con los objetos y sigo recibiendo el mismo mensaje de error.

OGRDataSource *hDS;
OGRSFDriver   *Driver;
OGRFeature    *pFeat;

hDS = OGRSFDriverRegistrar::Open(BasePath,FALSE,&Driver);
OGRLayer *Layer = hDS->GetLayerByName(ThisLayerName);
Layer->ResetReading();

while ((pFeat = Layer->GetNextFeature()) != NULL)
{
    // I did intend to do something here
    OGRFeature::DestroyFeature(pFeat); // error occurs here
}
OGRDataSource::DestroyDataSource(hDS);

Estoy utilizando la fuente OGR2OGR como referencia sobre cómo leer una fuente de datos OGR. Puedo ver en la referencia que cada característica devuelta se destruye antes de agarrar una nueva hasta la última característica y la fuente de datos se destruye a partir de entonces.

Estoy usando la versión 1.10 64bit de GDAL en Windows 7 64bit; he probado las versiones anteriores 1.9.2 y 1.8 y todas devuelven el mismo error. Estoy usando Visual C++ si eso hace alguna diferencia.

1voto

Flinkman Puntos 4821

En primer lugar, quiero dar las gracias a Frank por haberse tomado la molestia de leer mi post, por los fantásticos ejemplos y por el post que me ha permitido trabajar con GDAL/OGR en Visual Studio. Para cualquiera que esté interesado, el secreto para usar GDAL/OGR con Visual Studio es enlazar con gdal_i.lib en dependencias adicionales.

Esta situación parece haber surgido a partir de un código que no he proporcionado:

OGRSpatialReference *OGR_SR = Layer->GetSpatialRef();
OGR_SR->Validate();
char* SR_Text;
OGR_SR->exportToWkt(&SR_Text); 
OGRFree(OGR_SR); // THIS IS THE PROBLEM

Estaba usando la referencia espacial para la capa y la descarté obedientemente, sin embargo después de profundizar en los códigos fuente de OGR (ogrfeature.cpp y ogrgeometry.cpp) pude ver que el destructor espera eliminar la referencia espacial... ogrfeature elimina la geometría y luego la geometría elimina la referencia espacial, al eliminarla yo mismo no quedaba nada que eliminar de ahí la "violación de acceso".

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X