Skip to content

Commit cc69e37

Browse files
committed
Fix leak when a transform error occurs while transforming linestrings
(cherry-picked from 4af5ff5)
1 parent 60f0a23 commit cc69e37

File tree

1 file changed

+11
-12
lines changed

1 file changed

+11
-12
lines changed

src/core/geometry/qgslinestring.cpp

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -786,24 +786,23 @@ int QgsLineString::dimension() const
786786

787787
void QgsLineString::transform( const QgsCoordinateTransform &ct, QgsCoordinateTransform::TransformDirection d, bool transformZ )
788788
{
789-
double *zArray = mZ.data();
790-
789+
double *zArray = nullptr;
791790
bool hasZ = is3D();
792791
int nPoints = numPoints();
793-
bool useDummyZ = !hasZ || !transformZ;
794-
if ( useDummyZ )
792+
793+
// it's possible that transformCoords will throw an exception - so we need to use
794+
// a smart pointer for the dummy z values in order to ensure that they always get cleaned up
795+
std::unique_ptr< double[] > dummyZ;
796+
if ( !hasZ || !transformZ )
795797
{
796-
zArray = new double[nPoints];
797-
for ( int i = 0; i < nPoints; ++i )
798-
{
799-
zArray[i] = 0;
800-
}
798+
dummyZ.reset( new double[nPoints]() );
799+
zArray = dummyZ.get();
801800
}
802-
ct.transformCoords( nPoints, mX.data(), mY.data(), zArray, d );
803-
if ( useDummyZ )
801+
else
804802
{
805-
delete[] zArray;
803+
zArray = mZ.data();
806804
}
805+
ct.transformCoords( nPoints, mX.data(), mY.data(), zArray, d );
807806
clearCache();
808807
}
809808

0 commit comments

Comments
 (0)