diff --git a/Modules/IO/ImageBase/include/itkImageSeriesReader.h b/Modules/IO/ImageBase/include/itkImageSeriesReader.h index f9af3684bb7..a4db232965b 100644 --- a/Modules/IO/ImageBase/include/itkImageSeriesReader.h +++ b/Modules/IO/ImageBase/include/itkImageSeriesReader.h @@ -178,7 +178,7 @@ class ITK_TEMPLATE_EXPORT ImageSeriesReader : public ImageSource : m_ImageIO(nullptr) {} - ~ImageSeriesReader() override; + ~ImageSeriesReader() override = default; void PrintSelf(std::ostream & os, Indent indent) const override; @@ -205,10 +205,6 @@ class ITK_TEMPLATE_EXPORT ImageSeriesReader : public ImageSource */ unsigned int m_NumberOfDimensionsInImage{ 0 }; - /** Array of MetaDataDictionaries. This allows to hold information from the - * ImageIO objects after reading every sub image in the series */ - DictionaryArrayType m_MetaDataDictionaryArray{}; - bool m_UseStreaming{ true }; bool m_SpacingDefined{ false }; @@ -221,6 +217,13 @@ class ITK_TEMPLATE_EXPORT ImageSeriesReader : public ImageSource int ComputeMovingDimensionIndex(ReaderType * reader); + /** Array of MetaDataDictionaries. This allows to hold information from the + * ImageIO objects after reading every sub image in the series */ + DictionaryArrayType m_MetaDataDictionaryArray{}; + + /** The internal storage of MetaDataDictionaries. */ + std::vector m_InternalMetaDataDictionaries{}; + /** Modified time of the MetaDataDictionaryArray */ TimeStamp m_MetaDataDictionaryArrayMTime{}; diff --git a/Modules/IO/ImageBase/include/itkImageSeriesReader.hxx b/Modules/IO/ImageBase/include/itkImageSeriesReader.hxx index 452980f41ac..66b98d7b76c 100644 --- a/Modules/IO/ImageBase/include/itkImageSeriesReader.hxx +++ b/Modules/IO/ImageBase/include/itkImageSeriesReader.hxx @@ -30,22 +30,6 @@ namespace itk { -// Destructor -template -ImageSeriesReader::~ImageSeriesReader() -{ - // Clear the eventual previous content of the MetaDictionary array - if (!m_MetaDataDictionaryArray.empty()) - { - for (auto & i : m_MetaDataDictionaryArray) - { - // each element is a raw pointer, delete them. - delete i; - } - } - m_MetaDataDictionaryArray.clear(); -} - template void ImageSeriesReader::PrintSelf(std::ostream & os, Indent indent) const @@ -102,15 +86,8 @@ ImageSeriesReader::GenerateOutputInformation() const std::string key("ITK_ImageOrigin"); // Clear the previous content of the MetaDictionary array - if (!m_MetaDataDictionaryArray.empty()) - { - for (auto & i : m_MetaDataDictionaryArray) - { - // each element is a raw pointer, delete them. - delete i; - } - } m_MetaDataDictionaryArray.clear(); + m_InternalMetaDataDictionaries.clear(); const auto numberOfFiles = static_cast(m_FileNames.size()); if (numberOfFiles == 0) @@ -297,6 +274,8 @@ ImageSeriesReader::GenerateData() double maxSpacingDeviation = 0.0; bool prevSliceIsValid = false; + m_InternalMetaDataDictionaries.reserve(static_cast(numberOfFiles)); + for (int i = 0; i != numberOfFiles; ++i) { if (TOutputImage::ImageDimension != this->m_NumberOfDimensionsInImage) @@ -457,17 +436,23 @@ ImageSeriesReader::GenerateData() // Deep copy the MetaDataDictionary into the array if (reader->GetImageIO() && needToUpdateMetaDataDictionaryArray) { - auto newDictionary = new DictionaryType; - *newDictionary = reader->GetImageIO()->GetMetaDataDictionary(); + MetaDataDictionary newDictionary = reader->GetImageIO()->GetMetaDataDictionary(); if (nonUniformSampling) { // slice-specific information - EncapsulateMetaData(*newDictionary, "ITK_non_uniform_sampling_deviation", spacingDeviation); + EncapsulateMetaData(newDictionary, "ITK_non_uniform_sampling_deviation", spacingDeviation); } - m_MetaDataDictionaryArray.push_back(newDictionary); + m_InternalMetaDataDictionaries.push_back(std::move(newDictionary)); } } // end per slice loop + m_MetaDataDictionaryArray.clear(); + m_MetaDataDictionaryArray.reserve(m_InternalMetaDataDictionaries.size()); + + for (MetaDataDictionary & dictionary : m_InternalMetaDataDictionaries) + { + m_MetaDataDictionaryArray.push_back(&dictionary); + } if (TOutputImage::ImageDimension != this->m_NumberOfDimensionsInImage && maxSpacingDeviation > m_SpacingWarningRelThreshold * outputSpacing[this->m_NumberOfDimensionsInImage])