我知道很多人都存在VS版本的问题。 Debug模式。我进行了很多搜索,并遍历了程序的堆栈跟踪并检查了指针。但是,我无法理解为什么我的程序在Debug模式下可以正常运行而在Release模式下出现Access Violation错误!我深入了解了ITK代码中的某些步骤后,突然发现一个函数导致访问冲突。我将首先显示我的代码,然后显示导致此访问冲突的调用层次结构:

这是我的类型定义:

//typedef unsigned char PixelType;
const unsigned int dimention = 3;

//STD types
typedef std::vector<std::string> FileNamesContainer;
typedef std::vector<std::string> SeriesUIDContainer;

//ITK Types
typedef itk::DICOMSeriesFileNames NamesGeneratorType;
typedef itk::Image <signed short, dimention> ImageType; //Defining Image Type
typedef itk::ImageSeriesReader<ImageType> ReaderType; //Defining the type of the image series reader

//GDCM Types
typedef itk::GDCMImageIO DICOMImageIOType;

这是我的功能:
ReaderType::Pointer itkReadDICOM::ReadImages(char *sourceFolderAddress, std::string &seriesUID)
{
    std::cout<<"- Getting file names in: "<<sourceFolderAddress<<std::endl;
    std::cout<<"- Series ID: "<<seriesUID<<std::endl;

    //Creating a pointer to an object of the reader type. ReaderType is defined on top as itk ImageSeriesReader
    ReaderType::Pointer reader = ReaderType::New();

    //Setting the IO type by creating a dicomIO object from the GDCMImageIO. This will make sure we read DICOM images.
    DICOMImageIOType::Pointer dicomIO = DICOMImageIOType::New();
    reader->SetImageIO(dicomIO);

    //Creating a dicom series name generator. It will generate the name of the dicom series based on the input directory.
    NamesGeneratorType::Pointer namesGenerator = NamesGeneratorType::New();
    namesGenerator->SetDirectory(sourceFolderAddress);

    //Getting names and passing the names to the reader to read them.
    FileNamesContainer fileNames = namesGenerator->GetFileNames(seriesUID);
    reader->SetFileNames(fileNames);

    std::cout<<"- Reading files ... ";

    //Adding a reading progress observer to the reader so we can see how are we reading.
    ITKCmdProgressObserver::Pointer progressObserver = ITKCmdProgressObserver::New();
    reader->AddObserver(itk::ProgressEvent(), progressObserver);

    //Actually reading the files here. If any error happens it will be Printed and the program exists.
    try
    {
        reader->UpdateLargestPossibleRegion();
        std::cout<<"Successfully read "<< fileNames.size() <<" file(s)."<<std::endl;
    }
    catch  (itk::ExceptionObject &ex)
    {
        std::cout<<"Failed."<<std::endl<<"*********************************************************************"<<std::endl;
        std::cout<<ex<<std::endl;
        std::cout<<"*********************************************************************"<<std::endl;
        return 0;
    }
    return reader;
}

导致错误的 call 是这样的:
reader->UpdateLargestPossibleRegion();

上面的函数调用通过此调用链最终导致错误:

1。
this->UpdateOutputInformation(); //void ProcessObject::UpdateLargestPossibleRegion()

2。
this->GenerateOutputInformation(); //void ProcessObject::Update()

3。
reader->UpdateOutputInformation(); //template <class TOutputImage> void ImageSeriesReader<TOutputImage>::GenerateOutputInformation(void)

4。
this->GenerateOutputInformation(); //void ProcessObject::UpdateOutputInformation()

5,
m_ImageIO->SetFileName(m_FileName.c_str());
m_ImageIO->ReadImageInformation(); //template <class TOutputImage, class ConvertPixelTraits> void ImageFileReader<TOutputImage, ConvertPixelTraits> ::GenerateOutputInformation(void)

在步骤5,第一行正常,第二行导致访问冲突。它甚至不让我逐步解决。我正在使用Visual Studio2010。感谢您的回答。

最佳答案

感谢Paolo的回答。我并行尝试了几件事,直到找到解决方案!虽然我无法真正获得gflags来运行我的程序,但是由于我有种直觉,所以问题并不是代码中的问题,因此我没有花太多时间在代码上。

无论如何,这就是我所做的,解决了问题:

我从ITK网站下载了一个名为resampleDICOM的样本并进行了编译,并遇到了完全相同的问题。所以起初我以为是ITK错误。然后,我使用调试(RelWithDebInfo)在 Release模式下重新编译了ITK,因此在 Release模式下调试时可以进入ITK代码。令我惊讶的是,一个与GDCMImageIO::MetaDataDictionary相关的完全有效的指针突然变成了错误的指针(),而没有任何代码对其造成影响。所以我意识到某个地方应该有堆损坏!我还知道导致这种损坏的原因不在我的代码中。

因此,我读了太多线程,以至于将Debug和Release .lib和.dll文件混在一起会使事情真的很讨厌。但是我确定我使用了ITK版本的.lib文件和.dll文件,因为我检查了很多次!我的意思是MAAANY次!我打算从阳台上跳下来,结束这种痛苦,因为我有这个主意只是为了确保程序中没有使用ITK的调试编译。 ,所以我将ITK调试文件夹的名称更改为,然后在 Release模式下运行程序,突然:

ITKCommon.dll is missing!

尽管我将Visual Studio中的所有文件夹和所有设置都设置为使用发布文件夹,但我的程序还是在运行时从调试文件夹中使用了ITKCommon.dll。 因此,我将ITKCommon.dll从发行版本复制到了我的发行文件夹中,瞧!我的程序运作得很迷人。

关于c++ - 读取DICOM文件时, Release模式下出现ITK访问冲突错误,但 Debug模式下不出现ITK访问冲突错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14948611/

10-12 22:35