【问题标题】:itk filereader causes access violation exceptionitk filereader 导致访问冲突异常
【发布时间】:2010-10-31 20:43:54
【问题描述】:

我遇到了访问冲突异常的问题。 我正在使用 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-&gt;GetLargestPossibleRegion().GetSize();。我收到访问冲突错误。重要的是要注意,如果我不外包代码并将其放在 main 方法中,它就像一个魅力。可能是什么问题呢?我该如何解决?

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

MyClass imIO;

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

再次,如果我将函数中的代码完全放入它可以工作的 main 方法中。

[/编辑]

[题外话] 也许版主可以将其标记为 itk,因为这是一个特定于 itk 的问题? [/offtopic]

【问题讨论】:

  • ITK - itk.org - ITK 是一个开源的跨平台系统,可为开发人员提供一套广泛的图像分析软件工具。
  • 我知道,我正在使用它。 ???.
  • 你当然知道ITK是什么,但其他人不会知道它是什么。我不知道。我将链接放在那里,以便其他人可以更轻松地找出它是什么,并在他们喜欢的情况下阅读它的文档。
  • 没想到,你的权利。

标签: c++ exception vtk itk


【解决方案1】:

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

fileReader = ImageFileReaderType::New();

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

【讨论】:

    【解决方案2】:

    我在这里看到的唯一问题是您通过复制将filename 传递给函数。函数返回后,从调用c_str() 接收到的指针无效。

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

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

    您的更新跟进:这听起来像是又一次愚蠢的尝试,但您会检查空指针吗?您确定所有GetOutput()methods 都返回有效对象吗?很多 C++ 库(不幸的是)更喜欢返回空指针来抛出异常......

    既然你说如果你把所有的东西都放在main() 中它会起作用,我假设你在转换中会发生一些微妙的事情来获取当前代码。我们可以查看两个样本进行比较吗?

    【讨论】:

    • @inf.ig.sh:你能发布一些客户端代码吗?我认为发布的列表中没有足够的信息来诊断您的错误。
    • 我很确定这不是主要方法中的问题,它现在看起来像这样:MyClass imIO; const char* filename = "文件路径"; ThreeDImageFloatType *t3dim = imIO.loadImage(filename) 之后,我尝试如上所述访问 t3dim 指针。再次,如果我将代码完整地放在它的主要方法中。
    • 我看到代码在 cmets 中不是真正可读的,所以我会更新这个问题。
    • 对。 c_str() 不返回 std::string 中字符的副本。如果 std::string 超出范围,那么您从中获得的 c_str() 可能会变得无效。这可能不是问题,但需要注意。
    • 我当然在问问题之前对其进行了调试。不,它不是空指针。
    猜你喜欢
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    相关资源
    最近更新 更多