Skip to content

Commit 9fb0783

Browse files
authored
Merge pull request InsightSoftwareConsortium#5997 from hjmjohnson/cpp-cg-voxbocub-unique-ptr
COMP: Replace raw pointers with std::unique_ptr in VoxBoCUBImageIO
2 parents 36ea230 + 6c699a6 commit 9fb0783

2 files changed

Lines changed: 21 additions & 24 deletions

File tree

Modules/Nonunit/Review/include/itkVoxBoCUBImageIO.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include <fstream>
2323
#include <string>
2424
#include <map>
25+
#include <memory>
2526
#include "itkImageIOBase.h"
2627
#include "itkSpatialOrientation.h"
2728
#include <cstdio>
@@ -103,13 +104,14 @@ class VoxBoCUBImageIO : public ImageIOBase
103104
bool
104105
CheckExtension(const char *, bool & isCompressed);
105106

106-
GenericCUBFileAdaptor *
107+
std::unique_ptr<GenericCUBFileAdaptor>
107108
CreateReader(const char * filename);
108109

109-
GenericCUBFileAdaptor *
110+
std::unique_ptr<GenericCUBFileAdaptor>
110111
CreateWriter(const char * filename);
111112

112-
GenericCUBFileAdaptor *m_Reader{ nullptr }, *m_Writer{ nullptr };
113+
std::unique_ptr<GenericCUBFileAdaptor> m_Reader;
114+
std::unique_ptr<GenericCUBFileAdaptor> m_Writer;
113115

114116
// Initialize the orientation map (from strings to ITK)
115117
void

Modules/Nonunit/Review/src/itkVoxBoCUBImageIO.cxx

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -330,14 +330,14 @@ VoxBoCUBImageIO::VoxBoCUBImageIO()
330330
m_ByteOrder = IOByteOrderEnum::BigEndian;
331331
}
332332

333-
/** Destructor */
334-
VoxBoCUBImageIO::~VoxBoCUBImageIO()
335-
{
336-
delete m_Reader;
337-
delete m_Writer;
338-
}
339-
340-
GenericCUBFileAdaptor *
333+
// Destructor must be defined in the .cxx where GenericCUBFileAdaptor is a
334+
// complete type, so that std::unique_ptr<GenericCUBFileAdaptor> can be
335+
// correctly destroyed. Defining ~VoxBoCUBImageIO() = default in the header
336+
// would instantiate ~unique_ptr<GenericCUBFileAdaptor> with an incomplete
337+
// type, causing undefined behavior or a compile error.
338+
VoxBoCUBImageIO::~VoxBoCUBImageIO() = default;
339+
340+
std::unique_ptr<GenericCUBFileAdaptor>
341341
VoxBoCUBImageIO::CreateReader(const char * filename)
342342
{
343343
try
@@ -347,11 +347,11 @@ VoxBoCUBImageIO::CreateReader(const char * filename)
347347
{
348348
if (compressed)
349349
{
350-
return new CompressedCUBFileAdaptor(filename, "rb");
350+
return std::make_unique<CompressedCUBFileAdaptor>(filename, "rb");
351351
}
352352
else
353353
{
354-
return new DirectCUBFileAdaptor(filename, "rb");
354+
return std::make_unique<DirectCUBFileAdaptor>(filename, "rb");
355355
}
356356
}
357357
else
@@ -365,7 +365,7 @@ VoxBoCUBImageIO::CreateReader(const char * filename)
365365
}
366366
}
367367

368-
GenericCUBFileAdaptor *
368+
std::unique_ptr<GenericCUBFileAdaptor>
369369
VoxBoCUBImageIO::CreateWriter(const char * filename)
370370
{
371371
try
@@ -375,11 +375,11 @@ VoxBoCUBImageIO::CreateWriter(const char * filename)
375375
{
376376
if (compressed)
377377
{
378-
return new CompressedCUBFileAdaptor(filename, "wb");
378+
return std::make_unique<CompressedCUBFileAdaptor>(filename, "wb");
379379
}
380380
else
381381
{
382-
return new DirectCUBFileAdaptor(filename, "wb");
382+
return std::make_unique<DirectCUBFileAdaptor>(filename, "wb");
383383
}
384384
}
385385
else
@@ -397,7 +397,7 @@ bool
397397
VoxBoCUBImageIO::CanReadFile(const char * filename)
398398
{
399399
// First check if the file can be read
400-
GenericCUBFileAdaptor * reader = CreateReader(filename);
400+
auto reader = CreateReader(filename);
401401

402402
if (reader == nullptr)
403403
{
@@ -434,7 +434,6 @@ VoxBoCUBImageIO::CanReadFile(const char * filename)
434434
iscub = false;
435435
}
436436

437-
delete reader;
438437
return iscub;
439438
}
440439

@@ -468,10 +467,7 @@ VoxBoCUBImageIO::Read(void * buffer)
468467
void
469468
VoxBoCUBImageIO::ReadImageInformation()
470469
{
471-
// Make sure there is no other reader
472-
delete m_Reader;
473-
474-
// Create a reader
470+
// Create a reader (assignment releases any previous reader)
475471
m_Reader = CreateReader(m_FileName.c_str());
476472
if (m_Reader == nullptr)
477473
{
@@ -741,8 +737,7 @@ VoxBoCUBImageIO::Write(const void * buffer)
741737
m_Writer = CreateWriter(m_FileName.c_str());
742738
WriteImageInformation();
743739
m_Writer->WriteData(buffer, this->GetImageSizeInBytes());
744-
delete m_Writer;
745-
m_Writer = nullptr;
740+
m_Writer.reset();
746741
}
747742

748743
/** Print Self Method */

0 commit comments

Comments
 (0)