@@ -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>
341341VoxBoCUBImageIO::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>
369369VoxBoCUBImageIO::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
397397VoxBoCUBImageIO::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)
468467void
469468VoxBoCUBImageIO::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