Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 读取DICOM文件时,ITK访问冲突错误处于发布模式,但未处于调试模式_C++_Memory_Access Violation_Itk - Fatal编程技术网

C++ 读取DICOM文件时,ITK访问冲突错误处于发布模式,但未处于调试模式

C++ 读取DICOM文件时,ITK访问冲突错误处于发布模式,但未处于调试模式,c++,memory,access-violation,itk,C++,Memory,Access Violation,Itk,我知道很多人都有发布和调试模式的问题。我已经搜索了很多,检查了程序的堆栈跟踪和指针。然而,我无法理解为什么我的程序在调试模式下工作得很好,而在发布模式下却出现访问冲突错误!我看到在ITK代码中深入一些步骤后,一个函数突然导致访问冲突。我将首先介绍我的代码,然后介绍导致此访问冲突的调用层次结构: 以下是我的类型定义: //typedef unsigned char PixelType; const unsigned int dimention = 3; //STD types typedef s

我知道很多人都有发布和调试模式的问题。我已经搜索了很多,检查了程序的堆栈跟踪和指针。然而,我无法理解为什么我的程序在调试模式下工作得很好,而在发布模式下却出现访问冲突错误!我看到在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;
上述函数调用经过这一调用链,最终导致错误:

一,

二,

三,

五,

m_ImageIO->SetFileName(m_FileName.c_str());
m_ImageIO->ReadImageInformation()//模板void ImageFileReader::GenerateOutputInformation(void)
在步骤5中,第一行没有问题,第二行导致访问冲突。它甚至不让我穿过它。我正在使用VisualStudio2010。非常感谢您的回答。

尝试使用(WinSDK的调试工具中提供)或appverifier(我认为WinSDK中也有)

在应用程序上启用gflag(在调试模式下)时,它将发现内存中发生的所有令人讨厌的事情,并在发生错误时立即引发断点

尝试使用(在WinSDK的调试工具中提供)或appverifier(我想它也在WinSDK中)


在应用程序上启用gflag(在调试模式下)时,它将发现内存中发生的所有令人讨厌的事情,并在发生不好的事情时立即引发断点

谢谢Paolo的回答。我同时尝试了几件事,直到现在我找到了解决办法!虽然我不能真正让gflags运行我的程序,但因为我有一种直觉,认为问题并不真正在代码中,所以我没有在代码上投入太多时间

不管怎样,这就是我所做的和解决问题的方法:

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

所以我读了太多的线程,混合使用Debug和Release.lib和.dll文件会让事情变得非常糟糕。但我确信我使用的是ITK release.lib文件和.dll文件,因为我检查了很多次!我是说任何时候!我正要从阳台上跳下来结束这种痛苦,我有这个想法只是为了确保我的程序没有使用ITK调试编译中的任何内容因此,我将ITK调试文件夹的名称更改为其他名称,并在发布模式下运行我的程序,突然:

ITKCommon.dll is missing!

尽管我将visual studio中的所有文件夹和所有设置都设置为使用发行版文件夹,我的程序在运行时使用了调试文件夹中的ITKCommon.dll。所以我将发行版中的ITKCommon.dll复制到发行版文件夹中,瞧!我的程序非常有效

谢谢保罗的回答。我同时尝试了几件事,直到现在我找到了解决办法!虽然我不能真正让gflags运行我的程序,但因为我有一种直觉,认为问题并不真正在代码中,所以我没有在代码上投入太多时间

不管怎样,这就是我所做的和解决问题的方法:

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

所以我读了太多的线程,混合使用Debug和Release.lib和.dll文件会让事情变得非常糟糕。但我确信我使用的是ITK release.lib文件和.dll文件,因为我检查了很多次!我是说任何时候!我正要从阳台上跳下来结束这种痛苦,我有这个想法只是为了确保我的程序没有使用ITK调试编译中的任何内容因此,我将ITK调试文件夹的名称更改为其他名称,并在发布模式下运行我的程序,突然:

ITKCommon.dll is missing!
尽管我将visual studio中的所有文件夹和所有设置都设置为使用发行版文件夹,我的程序在运行时使用了调试文件夹中的ITKCommon.dll。所以我将发行版中的ITKCommon.dll复制到发行版文件夹中,瞧!我的程序非常有效

this->UpdateOutputInformation(); //void ProcessObject::UpdateLargestPossibleRegion()
this->GenerateOutputInformation(); //void ProcessObject::Update()
reader->UpdateOutputInformation(); //template <class TOutputImage> void ImageSeriesReader<TOutputImage>::GenerateOutputInformation(void)
this->GenerateOutputInformation(); //void ProcessObject::UpdateOutputInformation()
m_ImageIO->SetFileName(m_FileName.c_str());
m_ImageIO->ReadImageInformation(); //template <class TOutputImage, class ConvertPixelTraits> void ImageFileReader<TOutputImage, ConvertPixelTraits> ::GenerateOutputInformation(void)
ITKCommon.dll is missing!