itk filereader导致访问冲突异常

时间:2010-10-31 20:43:54

标签: c++ exception vtk itk

我遇到了访问冲突异常的问题。 我正在使用itk并使用它的文件阅读器读取文件。

ThreeDImageFloatType* MyClass::loadImage(std::string filename){
const char* cfilename = filename.c_str();
fileReader = ImageFileReaderType::New();
fileReader->SetFileName(cfilename);

try{ 
    fileReader->Update();
}catch( ... ) {
    std::cerr << "failed to read file " << filename << std::endl; 
}

CastFilterType::Pointer castFilter = CastFilterType::New();
castFilter->SetInput(fileReader->GetOutput());


castFilter->Update();

//ThreeDImageFloatType *t3dim = castFilter->GetOutput();
t3dim = castFilter->GetOutput();
return t3dim;
}

这是一个函数,该类还包含2个全局变量:

ImageFileReaderType::Pointer fileReader;
ThreeDImageFloatType *t3dim;

现在,如果你从例如我的main方法调用类中的函数并尝试访问返回值,例如t3dim->GetLargestPossibleRegion().GetSize();。我收到访问冲突错误。重要的是要注意,如果我没有外包代码,并在主要方法中使用它,它就像一个魅力。可能是什么问题呢?我该如何解决这个问题?

[编辑] 我尝试用const char * filename替换字符串文件名。主要方法如下所示。

MyClass imIO;

const char* filename = "path to file";
ThreeDImageFloatType *t3dim = imIO.loadImage(filename);
t3dim->GetLargestPossibleRegion().GetSize();

再次,如果我把函数中的代码completly放在main方法中就可以了。

[/编辑]

[offtopic] 也许主持人可以将其标记为itk,因为它是特定于itk的问题? [/ offtopic]

2 个答案:

答案 0 :(得分:1)

我自己就找到了答案。问题的解决方案就在这一行:

fileReader = ImageFileReaderType::New();

这是一个聪明的指针。因此,当函数返回时,它将被取消注册。因此,从该函数接收到内部缓冲区(读取文件)的指针不能再使用了。指针指向实际内存时,无法再访问它。访问冲突错误。

答案 1 :(得分:0)

我在这里看到的唯一问题是你将filename副本传递给函数。一旦函数返回,从c_str()的调用接收的指针无效。

ImageFileReaderType是否保留对此指针的引用并在调用GetSize()时使用它?

如果是这样,那么你可能想尝试一些其他的策略来保持filename变量在t3dim的整个生命周期内保持活跃状态​​。

更新后续跟踪:这可能听起来像是另一个愚蠢的尝试,但你检查空指针吗?您确定所有GetOutput()方法都返回有效对象吗?很多C ++库(不幸的是)更喜欢返回空指针来抛出异常......

既然你说如果你把main()中的所有内容都放在了它的工作中,我认为你的转换中有一些微妙之处就是获取当前的代码。我们可以看到两个样本进行比较吗?