2

提案されているように:私は2ギガより大きいファイルを持っています。次の関数を使用してメモリにマッピングしています。

char* ptr = (char*) MapViewOfFile( map_handle, 
      FILE_MAP_WRITE | FILE_MAP_READ, 0, 0, 0 );

ptrを受け入れるrapidxmlに解析しますCh*。Rapidxmlのドキュメントによるptrと、変更可能である必要がありますが、タイプであると宣言されているため、char*これを行うことはできません。プログラムはコンパイルされますが、実行時に次のエラーでクラッシュします:アクセス違反。これは、を解析しているときに発生することがわかりましたchar*。どうすればこれを回避できますか?

4

3 に答える 3

3

MapViewOfFile() の最後の引数に 0 を渡しています。その引数の名前は dwNumberOfBytesToMap です。ゼロを選択したため、2 ギガバイト全体がマップされます。これは 32 ビット モードでは機能しません。利用可能な仮想メモリがほとんどありません。ptr 値は NULL になり、ポインターを介して書き込みを試みると、AV が生成されます。

ファイルのセクションをマップする必要があります。

于 2010-06-28T20:50:47.803 に答える
2

盲目的な推測:ptrおそらくNULLです。ドキュメントから

関数が失敗した場合、戻り値は NULL です。拡張エラー情報を取得するには、GetLastError を呼び出します。

より多くの情報を提供していただければ、より多くの情報を提供できる可能性があります。デバッガで戻り値を確認してください。最初のハンドル パラメータについてmap_handle:CreateFileMapping およびOpenFileMapping 関数はこのハンドルを返します。たぶん、ハンドルを取得するために他の関数を使用しましたか?

于 2010-06-28T20:20:48.843 に答える
1

あなたの「アクセス違反」はメモリアクセスエラーです。つまり、プログラムは所有していないメモリにアクセスしました。これはおそらく、パーサーがファイルに割り当てられたメモリの境界を超えて読み取ろうとしたか、jdehaanが示唆するように、MapViewOfFile 関数が NULL を返していることが原因です。

アップデート:

MapViewOfFile が NULL を返さない場合、マップされたファイルに割り当てられた範囲を超えてアクセスしている可能性があります。この質問に対するコメントで、解析操作がいくつかの終了タグを追加して xml ドキュメントも変更していることを示しているようです。これにより、間違いなくファイルの長さが長くなるため、メモリ内のファイルのブロックの末尾を超えて書き込みます。これにより、表示されているエラーが発生します。

そうでない場合は、適切なアクセス指定子でCreateFileMappingを呼び出していない可能性があります。MapViewOfFileのドキュメントには、読み取り/書き込みアクセスを許可するマップ ビューが必要な場合は、ファイル マッピング オブジェクトを作成するときに PAGE_EXECUTE_READWRITE オプションを指定する必要があると記載されています。

そうでない場合は、ハンスの答えが鍵になるのではないかと思います。これを実行しているシステムは何ですか?Windows は 32 ビットですか、それとも 64 ビットですか? ファイルが 2GB を超える場合、マップできません。

于 2010-06-28T20:25:18.677 に答える