itk filereader вызывает исключение нарушения прав доступа - PullRequest
0 голосов
/ 31 октября 2010

У меня проблема с исключением из-за нарушения прав доступа.Я использую 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;

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

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

MyClass imIO;

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

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

[/ edit]

[offtopic] может быть модератор может пометить его как itk, так как это специфический вопрос для itk?[/ Оффтоп]

Ответы [ 2 ]

1 голос
/ 01 ноября 2010

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

fileReader = ImageFileReaderType::New();

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

0 голосов
/ 31 октября 2010

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

Сохраняет ли ImageFileReaderType ссылку на этот указатель и использует ее при вызове GetSize()?

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

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

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

...