0

アクセス違反の例外に問題があります。私は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();、アクセス違反エラーが発生します。コードを外部委託していないかどうかに注意することが重要です。それをmainメソッド内に含めると、魅力のように機能します。何が問題なのですか?どうすれば修正できますか?

[編集]文字列filenameをconstchar*filenameに置き換えてみました。主な方法は次のようになります。

MyClass imIO;

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

繰り返しますが、関数のコードをmainメソッドに完全に入れると、機能します。

[/編集]

[オフトピック]itk固有の質問なので、モデレーターはitkとしてタグ付けできますか?[/オフトピック]

4

2 に答える 2

1

自分で答えを見つけました。問題の解決策は次の行にあります。

fileReader = ImageFileReaderType::New();

それはスマートポインターです。したがって、関数が戻ると、登録が解除されます。そのため、その関数から受け取った内部バッファー(読み取りファイル)へのポインターは、これ以上使用できません。ポインタが実際のメモリを指している間は、それ以上アクセスできません。アクセス違反エラー。

于 2010-10-31T22:37:33.603 に答える
0

ここで私が目にする唯一の問題はfilename、関数にコピーを渡すことです。関数が戻ると、への呼び出しから受け取ったポインタはc_str()無効になります。

ImageFileReaderTypeこのポインタへの参照を保持し、それをへの呼び出しで使用していますGetSize()か?

もしそうなら、あなたは変数をの生涯filenameを通して生き続けるために他のいくつかのstategyを試してみたいかもしれません。t3dim

アップデートのフォローアップ:これは別のばかげた試みのように聞こえるかもしれませんが、nullポインターをチェックしますか?すべてのメソッドが有効なオブジェクトを返すことを確認しますか?GetOutput()多くのC++ライブラリは(残念ながら)例外をスローするよりもnullポインタを返すことを好みます...

すべてを入れればうまくいくとおっしゃっていたのでmain()、現在のコードを取得するための変換には微妙なことが起こっていると思います。比較する両方のサンプルを見ることができますか?

于 2010-10-31T20:51:24.840 に答える