2010-10-31 5 views
0

У меня проблема с Исключением нарушения доступа. Я использую itk и читаю файл с его файловым считывателем.itk filereader вызывает исключение нарушения доступа

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; 

Теперь при вызове функции в классе, например, от моего основного метода и пытаются получить доступ к возвращаемому значению, что-то вроде t3dim->GetLargestPossibleRegion().GetSize();. Я получаю ошибку нарушения доступа. Важно заметить, что если я не передаю код на аутсорсинг и не использую его в основном методе, он работает как шарм. В чем может быть проблема? Как это исправить?

[edit] Я попытался заменить строковое имя файла на const char * filename. Основной метод выглядит следующим образом.

MyClass imIO; 

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

Опять же, если я полностью поместил код из функции в основном методе, он работает.

[/ править]

[оффтоп] возможно модератор может пометить его как ИТК, так как это ИТК конкретный вопрос? [/ offtopic]

+0

ITK - http://itk.org - ITK - это кросс-платформенная система с открытым исходным кодом, которая предоставляет разработчикам обширный набор программных средств для анализа изображений. –

+0

Я знаю это, я использую его. ???. –

+0

Конечно, вы знаете, что такое ITK, но другие люди не будут знать, что это такое.Я не знал. Я разместил ссылку там, чтобы другие люди могли легче узнать, что это такое, и прочитать их документацию, если они понравились. –

ответ

1

К несчастью, я должен ответить на вопрос сам. Я только что нашел ответ. Решение проблемы лежит в пределах этой линии:

fileReader = ImageFileReaderType::New(); 

Это умный указатель. Поэтому, когда функция возвращается, она становится незарегистрированной. Таким образом, указатель, полученный от этой функции во внутренний буфер (файл чтения), больше не может быть использован. Хотя указатель указывает на актуарную память, к нему больше нельзя получить доступ. Ошибка при нарушении доступа.

0

Единственная проблема, которую я вижу здесь, заключается в том, что вы передаете filename копией функции. Указатель, полученный от вызова до c_str(), недействителен после возвращения функции.

Содержит ссылку на этот указатель и использует его в диалоговом окне GetSize()?

Если это так, то вам, возможно, захочется попробовать какую-либо другую стратегию, чтобы сохранить переменную filename в течение всей жизни t3dim.

Последующие действия по обновлению: это может звучать как другая глупая попытка, но вы проверяете нулевые указатели? Вы уверены что все методы GetOutput() возвращают действительные объекты? Многие библиотеки C++ (к сожалению) предпочитают возвращать нулевые указатели для исключения исключений ...

Поскольку вы сказали, что если вы поместили все в main(), это будет работать, я предполагаю, что в вашем преобразовании происходит некоторая тонкость, чтобы получить текущий код. Можем ли мы увидеть оба образца для сравнения?

+0

@ inf.ig.sh: можете ли вы разместить код клиента? Я не думаю, что в опубликованном списке достаточно, чтобы диагностировать вашу ошибку. –

+0

Я уверен, что это не проблема в основном методе, который выглядит прямо сейчас следующим образом: MyClass imIO; const char * filename = "путь к файлу"; 3DImageFloatType * t3dim = imIO.loadImage (filename) После этого я пытаюсь получить доступ к указателю t3dim, как описано выше. Опять же, если я поместил код полностью в основной метод, он работает. –

+0

Я вижу, что код не читается в комментариях, поэтому я обновлю вопрос. –

 Смежные вопросы

  • Нет связанных вопросов^_^