Ошибка во время выполнения: нарушение прав доступа при записи при удалении указателя при динамическом выделении памяти

Я написал этот код для показа шейп-файлов линий в окне 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 метод вместо кода
    соответствующим способом и внесите другие изменения в код.
    Также я загрузил свой код здесь в 4shared, Вы можете взять его здесь и просто ссылку Библиотека GDAL и запустить его.

Конечно, с помощью ответа Джона моя проблема была решена. Но я все равно буду благодарен тому, кто скажет мне, в чем проблема вышеуказанного кода?

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;

может быть переписан без какого-либо выделения памяти, как это

OGREnvelope poEnvelope;
error = poLayer ->GetExtent(&poEnvelope,true);
sBoundingBox.fMaxX = poEnvelope.MaxX;
sBoundingBox.fMaxY = poEnvelope.MaxY;
sBoundingBox.fMinX = poEnvelope.MinX;
sBoundingBox.fMinY = poEnvelope.MinY;

Аналогичное изменение может быть сделано для poPointTemp, Как правило, если вы выделяете память для объекта, а затем удаляете его в том же объеме это признак того, что вам вообще не нужно выделять память.

Ничто из этого не исправит ошибку, которая все еще скрыта, но дело в том, что, упрощая ваш код и выделяя меньше памяти, вы приблизитесь к реальной ошибке, которая, несомненно, является своего рода повреждением памяти.

1

Другие решения

У меня такая же проблема. Ваш код правильный.

В моем случае проблема была в другом gdal.dll в PATH. Убедитесь, что ваш исполняемый файл загружает нужную библиотеку.

(Существует много приложений, которые поставляются с gdal.dll и добавляют их папку в PATH. Как QGis или GeoConcept …)

0

По вопросам рекламы [email protected]