Skip to content

Commit 3c6f298

Browse files
N-Dekkerdzenanz
authored andcommitted
STYLE: Use unique_ptr for ImageToImageMetric data members
Following C++ Core Guidelines, August 19, 2021: "Use unique_ptr or shared_ptr to avoid forgetting to delete objects created using new" https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rh-smart Defaulted (`= default`) its destructor.
1 parent 3923f26 commit 3c6f298

2 files changed

Lines changed: 24 additions & 47 deletions

File tree

Modules/Registration/Common/include/itkImageToImageMetric.h

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
#include "itkCentralDifferenceImageFunction.h"
2727
#include "itkMultiThreaderBase.h"
2828

29+
#include <memory> // For unique_ptr.
30+
2931
namespace itk
3032
{
3133
/** \class ImageToImageMetric
@@ -327,12 +329,12 @@ class ITK_TEMPLATE_EXPORT ImageToImageMetric : public SingleValuedCostFunction
327329
const TransformPointer *
328330
GetThreaderTransform()
329331
{
330-
return m_ThreaderTransform;
332+
return m_ThreaderTransform.get();
331333
}
332334

333335
protected:
334336
ImageToImageMetric();
335-
~ImageToImageMetric() override;
337+
~ImageToImageMetric() override = default;
336338

337339
void
338340
PrintSelf(std::ostream & os, Indent indent) const override;
@@ -398,7 +400,7 @@ class ITK_TEMPLATE_EXPORT ImageToImageMetric : public SingleValuedCostFunction
398400
TransformPointer m_Transform;
399401
/** Copies of Transform helpers per thread (N-1 of them, since m_Transform
400402
* will do the work for thread=0. */
401-
TransformPointer * m_ThreaderTransform;
403+
std::unique_ptr<TransformPointer[]> m_ThreaderTransform;
402404

403405
InterpolatorPointer m_Interpolator;
404406

@@ -471,8 +473,8 @@ class ITK_TEMPLATE_EXPORT ImageToImageMetric : public SingleValuedCostFunction
471473
mutable BSplineTransformWeightsType m_BSplineTransformWeights;
472474
mutable BSplineTransformIndexArrayType m_BSplineTransformIndices;
473475

474-
mutable BSplineTransformWeightsType * m_ThreaderBSplineTransformWeights;
475-
mutable BSplineTransformIndexArrayType * m_ThreaderBSplineTransformIndices;
476+
mutable std::unique_ptr<BSplineTransformWeightsType[]> m_ThreaderBSplineTransformWeights;
477+
mutable std::unique_ptr<BSplineTransformIndexArrayType[]> m_ThreaderBSplineTransformIndices;
476478

477479
virtual void
478480
PreComputeTransformValues();
@@ -564,11 +566,11 @@ class ITK_TEMPLATE_EXPORT ImageToImageMetric : public SingleValuedCostFunction
564566
const typename MultiThreaderType::WorkUnitInfo * m_WorkUnitInfo;
565567
};
566568

567-
MultiThreaderType::Pointer m_Threader;
568-
ConstantPointerWrapper * m_ConstSelfWrapper;
569-
mutable unsigned int * m_ThreaderNumberOfMovingImageSamples{ nullptr };
570-
bool m_WithinThreadPreProcess{ false };
571-
bool m_WithinThreadPostProcess{ false };
569+
MultiThreaderType::Pointer m_Threader;
570+
std::unique_ptr<ConstantPointerWrapper> m_ConstSelfWrapper;
571+
mutable std::unique_ptr<unsigned int[]> m_ThreaderNumberOfMovingImageSamples;
572+
bool m_WithinThreadPreProcess{ false };
573+
bool m_WithinThreadPostProcess{ false };
572574

573575
void
574576
GetValueMultiThreadedInitiate() const;

Modules/Registration/Common/include/itkImageToImageMetric.hxx

Lines changed: 12 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,6 @@ ImageToImageMetric<TFixedImage, TMovingImage>::ImageToImageMetric()
3737
m_MovingImage(nullptr)
3838
, // has to be provided by the user.
3939
m_Transform(nullptr)
40-
, // has to be provided by the user.
41-
m_ThreaderTransform(nullptr)
4240
, // constructed at initialization.
4341
m_Interpolator(nullptr)
4442
, // metric computes gradient by default
@@ -55,13 +53,11 @@ ImageToImageMetric<TFixedImage, TMovingImage>::ImageToImageMetric()
5553
, m_BSplineParametersOffset()
5654
, m_BSplineTransformWeights()
5755
, m_BSplineTransformIndices()
58-
, m_ThreaderBSplineTransformWeights(nullptr)
59-
, m_ThreaderBSplineTransformIndices(nullptr)
6056
, m_BSplineInterpolator(nullptr)
6157
, m_DerivativeCalculator(nullptr)
6258
, m_Threader(MultiThreaderType::New())
6359
{
64-
m_ConstSelfWrapper = new ConstantPointerWrapper(this);
60+
m_ConstSelfWrapper = std::make_unique<ConstantPointerWrapper>(this);
6561
this->m_NumberOfWorkUnits = this->m_Threader->GetNumberOfWorkUnits();
6662

6763
/* if 100% backward compatible, we should include this...but...
@@ -75,23 +71,6 @@ ImageToImageMetric<TFixedImage, TMovingImage>::ImageToImageMetric()
7571
*/
7672
}
7773

78-
template <typename TFixedImage, typename TMovingImage>
79-
ImageToImageMetric<TFixedImage, TMovingImage>::~ImageToImageMetric()
80-
{
81-
delete m_ConstSelfWrapper;
82-
83-
delete[] m_ThreaderNumberOfMovingImageSamples;
84-
m_ThreaderNumberOfMovingImageSamples = nullptr;
85-
86-
delete[] m_ThreaderTransform;
87-
m_ThreaderTransform = nullptr;
88-
89-
delete[] this->m_ThreaderBSplineTransformWeights;
90-
this->m_ThreaderBSplineTransformWeights = nullptr;
91-
92-
delete[] this->m_ThreaderBSplineTransformIndices;
93-
this->m_ThreaderBSplineTransformIndices = nullptr;
94-
}
9574

9675
/**
9776
* Set the number of work units. This will be clamped by the
@@ -333,12 +312,10 @@ ImageToImageMetric<TFixedImage, TMovingImage>::MultiThreadingInitialize()
333312
{
334313
this->SetNumberOfWorkUnits(m_NumberOfWorkUnits);
335314

336-
delete[] m_ThreaderNumberOfMovingImageSamples;
337-
m_ThreaderNumberOfMovingImageSamples = new unsigned int[m_NumberOfWorkUnits - 1];
315+
m_ThreaderNumberOfMovingImageSamples.reset(new unsigned int[m_NumberOfWorkUnits - 1]);
338316

339317
// Allocate the array of transform clones to be used in every thread
340-
delete[] m_ThreaderTransform;
341-
m_ThreaderTransform = new TransformPointer[m_NumberOfWorkUnits - 1];
318+
m_ThreaderTransform.reset(new TransformPointer[m_NumberOfWorkUnits - 1]);
342319
for (ThreadIdType ithread = 0; ithread < m_NumberOfWorkUnits - 1; ++ithread)
343320
{
344321
this->m_ThreaderTransform[ithread] = this->m_Transform->Clone();
@@ -438,11 +415,8 @@ ImageToImageMetric<TFixedImage, TMovingImage>::MultiThreadingInitialize()
438415
this->m_BSplinePreTransformPointsArray.resize(1);
439416
this->m_WithinBSplineSupportRegionArray.resize(1);
440417

441-
delete[] this->m_ThreaderBSplineTransformWeights;
442-
this->m_ThreaderBSplineTransformWeights = nullptr;
443-
444-
delete[] this->m_ThreaderBSplineTransformIndices;
445-
this->m_ThreaderBSplineTransformIndices = nullptr;
418+
this->m_ThreaderBSplineTransformWeights.reset();
419+
this->m_ThreaderBSplineTransformIndices.reset();
446420

447421
if (this->m_UseCachingOfBSplineWeights)
448422
{
@@ -455,8 +429,8 @@ ImageToImageMetric<TFixedImage, TMovingImage>::MultiThreadingInitialize()
455429
}
456430
else
457431
{
458-
this->m_ThreaderBSplineTransformWeights = new BSplineTransformWeightsType[m_NumberOfWorkUnits - 1];
459-
this->m_ThreaderBSplineTransformIndices = new BSplineTransformIndexArrayType[m_NumberOfWorkUnits - 1];
432+
this->m_ThreaderBSplineTransformWeights.reset(new BSplineTransformWeightsType[m_NumberOfWorkUnits - 1]);
433+
this->m_ThreaderBSplineTransformIndices.reset(new BSplineTransformIndexArrayType[m_NumberOfWorkUnits - 1]);
460434
}
461435

462436
for (unsigned int j = 0; j < FixedImageDimension; ++j)
@@ -1084,7 +1058,7 @@ ImageToImageMetric<TFixedImage, TMovingImage>::GetValueMultiThreadedInitiate() c
10841058
{
10851059
this->SynchronizeTransforms();
10861060

1087-
m_Threader->SetSingleMethod(GetValueMultiThreaded, static_cast<void *>(m_ConstSelfWrapper));
1061+
m_Threader->SetSingleMethod(GetValueMultiThreaded, static_cast<void *>(m_ConstSelfWrapper.get()));
10881062
m_Threader->SingleMethodExecute();
10891063

10901064
for (ThreadIdType threadId = 0; threadId < m_NumberOfWorkUnits - 1; ++threadId)
@@ -1097,7 +1071,7 @@ template <typename TFixedImage, typename TMovingImage>
10971071
void
10981072
ImageToImageMetric<TFixedImage, TMovingImage>::GetValueMultiThreadedPostProcessInitiate() const
10991073
{
1100-
m_Threader->SetSingleMethod(GetValueMultiThreadedPostProcess, static_cast<void *>(m_ConstSelfWrapper));
1074+
m_Threader->SetSingleMethod(GetValueMultiThreadedPostProcess, static_cast<void *>(m_ConstSelfWrapper.get()));
11011075
m_Threader->SingleMethodExecute();
11021076
}
11031077

@@ -1189,7 +1163,7 @@ ImageToImageMetric<TFixedImage, TMovingImage>::GetValueAndDerivativeMultiThreade
11891163
{
11901164
this->SynchronizeTransforms();
11911165

1192-
m_Threader->SetSingleMethod(GetValueAndDerivativeMultiThreaded, static_cast<void *>(m_ConstSelfWrapper));
1166+
m_Threader->SetSingleMethod(GetValueAndDerivativeMultiThreaded, static_cast<void *>(m_ConstSelfWrapper.get()));
11931167
m_Threader->SingleMethodExecute();
11941168

11951169
for (ThreadIdType threadId = 0; threadId < m_NumberOfWorkUnits - 1; ++threadId)
@@ -1202,7 +1176,8 @@ template <typename TFixedImage, typename TMovingImage>
12021176
void
12031177
ImageToImageMetric<TFixedImage, TMovingImage>::GetValueAndDerivativeMultiThreadedPostProcessInitiate() const
12041178
{
1205-
m_Threader->SetSingleMethod(GetValueAndDerivativeMultiThreadedPostProcess, static_cast<void *>(m_ConstSelfWrapper));
1179+
m_Threader->SetSingleMethod(GetValueAndDerivativeMultiThreadedPostProcess,
1180+
static_cast<void *>(m_ConstSelfWrapper.get()));
12061181
m_Threader->SingleMethodExecute();
12071182
}
12081183

0 commit comments

Comments
 (0)