Я написал этот код для показа шейп-файлов линий в окне opengl.
На самом деле это код Рендеринг Shapefile в OpenGL здесь в коде проекта, но я делаю некоторые изменения, чтобы читать фигуры с помощью библиотеки OGR, а не shapelib.
#include "ogrsf_frmts.h"//#include "shapelib\shapefil.h"
void OpenShapeFile(char* filename)
{
int i = 0;
int j = 0;
OGRErr error;
OGRDataSource *poDataSource;
poDataSource = OGRSFDriverRegistrar::Open(filename,false);
OGRLayer *poLayer;
poLayer = poDataSource ->GetLayer(0);
OGREnvelope *poEnvelope = new OGREnvelope();
error = poLayer ->GetExtent(poEnvelope,true);
sBoundingBox.fMaxX = poEnvelope ->MaxX;
sBoundingBox.fMaxY = poEnvelope ->MaxY;
sBoundingBox.fMinX = poEnvelope ->MinX;
sBoundingBox.fMinY = poEnvelope ->MinY;
delete poEnvelope;
OGRwkbGeometryType GeometryType = poLayer ->GetGeomType();
int NumberOfFeatures = poLayer ->GetFeatureCount(true);
poLayer ->ResetReading();
//Line Shapefile
if ( wkbFlatten ( GeometryType ) == wkbLineString )
{
OGRFeature *poFeature;
MyLineString2D lineString;
//temporary pointer in order to store coordinates of individual line vertexes
OGRPoint *poPointTemp = new OGRPoint();
for ( i = 0; i < NumberOfFeatures; i++ )
{
poFeature = poLayer ->GetNextFeature();
OGRGeometry *poGeometry;
poGeometry = poFeature ->GetGeometryRef();
if ( poGeometry != NULL )
{
OGRLineString *poLineString = (OGRLineString *)poGeometry;
int NumberOfVertexes = poLineString ->getNumPoints();
lineString.vPointList.resize(NumberOfVertexes);
for ( j = 0; j < NumberOfVertexes ; j++ )
{
poLineString ->getPoint(j,poPointTemp);
MyPoint2D ptTemp;
ptTemp.dX = poPointTemp ->getX();
ptTemp.dY = poPointTemp ->getY();
lineString.vPointList.at(j) = ptTemp;
}
vLines.push_back(lineString);
}
OGRFeature::DestroyFeature( poFeature );
}
delete poPointTemp;
}
}
void initializeGL()
{
//glClearColor (0.0, 0.0, 0.0, 0.0);
glClearColor (1.0, 1.0, 1.0, 1.0);
int main(int argc, char** argv)
{
//OpenShapeFile("Shapefiles\\poi.shp");//Point Shapefile
OpenShapeFile("Shapefiles\\strassen.shp");//Line Shapefile
//OpenShapeFile("Shapefiles\\gruenflaechen.shp");//Polygon Shapefile
когда я комментирую строку:
delete poPointTemp;
ошибки нет, и форма рисуется в окне OpenGL правильно. Но, как вы знаете, это вид утечки памяти, поэтому, когда мне не нужно poPointTemp
Я должен удалить это.
Но на линии:
delete poPointTemp;
Я получаю ошибку во время выполнения:
Я отладил свой код, а также адрес и содержимое poPointTemp
перед запуском эта строка выглядит следующим образом:
poPointTemp 0x00503a90 {x=3435936.3300000001 y=5790327.5999999996 z=0.00000000000000000 }
Я имею в виду poPointTemp
не является пустым указателем, а адрес, к которому у нас нет доступа, не совпадает с poPointTemp
адрес !!!
в чем проблема моего кода?
Я пытался свести к минимуму код столько, сколько я могу. Так что если вы хотите отладить код самостоятельно, вы можете скачать его в код-проект а затем просто внесите в него изменения в соответствии с кодом, который я написал выше.
OpenShapeFile
метод вместо кодаКонечно, с помощью ответа Джона моя проблема была решена. Но я все равно буду благодарен тому, кто скажет мне, в чем проблема вышеуказанного кода?
Это не совсем ответ, но это может помочь, и это слишком долго, чтобы добавить комментарий. Также имейте в виду, что я не знаю эту библиотеку, поэтому мой совет может быть неверным.
Несомненно, эта ошибка маскирует реальную ошибку, которая находится где-то еще в вашем коде. Как вы говорите, вы должен удалите память на этом этапе. Однако мне кажется, что вы излишне выделяете память. Например, это
OGREnvelope *poEnvelope = new OGREnvelope();
error = poLayer ->GetExtent(poEnvelope,true);
sBoundingBox.fMaxX = poEnvelope ->MaxX;
sBoundingBox.fMaxY = poEnvelope ->MaxY;
sBoundingBox.fMinX = poEnvelope ->MinX;
sBoundingBox.fMinY = poEnvelope ->MinY;
delete poEnvelope;
может быть переписан без какого-либо выделения памяти, как это
OGREnvelope poEnvelope;
error = poLayer ->GetExtent(&poEnvelope,true);
sBoundingBox.fMaxX = poEnvelope.MaxX;
sBoundingBox.fMaxY = poEnvelope.MaxY;
sBoundingBox.fMinX = poEnvelope.MinX;
sBoundingBox.fMinY = poEnvelope.MinY;
Аналогичное изменение может быть сделано для poPointTemp
, Как правило, если вы выделяете память для объекта, а затем удаляете его в том же объеме это признак того, что вам вообще не нужно выделять память.
Ничто из этого не исправит ошибку, которая все еще скрыта, но дело в том, что, упрощая ваш код и выделяя меньше памяти, вы приблизитесь к реальной ошибке, которая, несомненно, является своего рода повреждением памяти.
У меня такая же проблема. Ваш код правильный.
В моем случае проблема была в другом gdal.dll в PATH. Убедитесь, что ваш исполняемый файл загружает нужную библиотеку.
(Существует много приложений, которые поставляются с gdal.dll и добавляют их папку в PATH. Как QGis или GeoConcept …)