Skip to content

Commit 8f7af1c

Browse files
author
wonder
committed
Fixed an occasional segfault coming from incorrect geometry deletion.
git-svn-id: http://svn.osgeo.org/qgis/branches/symbology-ng-branch@10915 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 7523b25 commit 8f7af1c

File tree

2 files changed

+18
-3
lines changed

2 files changed

+18
-3
lines changed

src/plugins/labeling/pallabeling.cpp

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,11 @@ void LayerSettings::registerFeature(QgsFeature& f)
8989
double labelX, labelY; // will receive label size
9090
calculateLabelSize(labelText, labelX, labelY);
9191

92-
//std::cout << labelX << " " << labelY << std::endl;
9392
MyLabel* lbl = new MyLabel(f.id(), labelText, GEOSGeom_clone( f.geometry()->asGeos() ) );
9493

94+
// record the created geometry - it will be deleted at the end.
95+
geometries.append(lbl);
96+
9597
// register feature to the layer
9698
palLayer->registerFeature(lbl->strId(), lbl, labelX, labelY);
9799

@@ -106,6 +108,7 @@ void LayerSettings::registerFeature(QgsFeature& f)
106108
PalLabeling::PalLabeling(QgsMapCanvas* mapCanvas)
107109
: mMapCanvas(mapCanvas), mPal(NULL)
108110
{
111+
109112
// find out engine defaults
110113
Pal p;
111114
mCandPoint = p.getPointP();
@@ -244,6 +247,7 @@ void PalLabeling::initPal()
244247
case Popmusic_Tabu_Chain: s = POPMUSIC_TABU_CHAIN; break;
245248
}
246249
mPal->setSearch(s);
250+
//mPal->setSearch(FALP);
247251

248252
// set number of candidates generated per feature
249253
mPal->setPointP(mCandPoint);
@@ -278,7 +282,7 @@ void PalLabeling::doLabeling(QPainter* painter)
278282
{
279283
labels = mPal->labeller(scale, bbox, NULL, false);
280284
}
281-
catch ( std::exception e )
285+
catch ( std::exception& e )
282286
{
283287
std::cerr << "PAL EXCEPTION :-( " << e.what() << std::endl;
284288
return;
@@ -308,14 +312,22 @@ void PalLabeling::doLabeling(QPainter* painter)
308312
painter->drawText(0,0, ((MyLabel*)label->getGeometry())->text());
309313
painter->restore();
310314

311-
delete label->getGeometry();
312315
delete label;
313316
}
314317

315318
std::cout << "LABELING draw: " << t.elapsed() << "ms" << std::endl;
316319

317320
delete labels;
318321

322+
// delete all allocated geometries for features
323+
for (int i = 0; i < mLayers.count(); i++)
324+
{
325+
LayerSettings& lyr = mLayers[i];
326+
for (QList<MyLabel*>::iterator git = lyr.geometries.begin(); git != lyr.geometries.end(); ++git)
327+
delete *git;
328+
lyr.geometries.clear();
329+
}
330+
319331
// re-create PAL
320332
initPal();
321333
}

src/plugins/labeling/pallabeling.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ class QgsMapCanvas;
77
#include <QString>
88
#include <QFont>
99
#include <QColor>
10+
#include <QList>
1011

1112
namespace pal
1213
{
@@ -18,6 +19,7 @@ class QgsMapToPixel;
1819
class QgsFeature;
1920
#include "qgspoint.h"
2021

22+
class MyLabel;
2123

2224
class LayerSettings
2325
{
@@ -57,6 +59,7 @@ class LayerSettings
5759
int fontBaseline;
5860
const QgsMapToPixel* xform;
5961
QgsPoint ptZero;
62+
QList<MyLabel*> geometries;
6063
};
6164

6265
class PalLabeling

0 commit comments

Comments
 (0)