2012-01-26 7 views
-2

次のコードは、コマンドプロンプトから呼び出された場合にのみシステムアクセス違反例外をスローします。どうして?実行時に、例外はfstreamの148行目にスローされます。これはVSでデバッグするときには発生しませんが、コマンドプロンプトからコンパイルされたプログラムを実行しようとすると、昇格したコマンドプロンプトと同じです。システムアクセス違反はVS2010ではなくコンパイルされた形式でスローされます。なぜですか?

#include <stdafx.h> 
#include <iostream> 
#include <sstream> 
#include <fstream> 
#include <windows.h> 

using namespace std; 
using namespace System; 

ifstream::pos_type size; 
int filesize; 
char * memblock; 

int main() { 
    fstream wfile ("C:\\Plans\\Plan.txt" , ios::out|ios::ate|ios::app); 
    if(wfile.is_open())            
    { 
     wfile<<"\n"; 
     wfile.close(); 
    } 

    ifstream file ("C:\\Plans\\Plan.txt" , ios::in|ios::ate); 
    if (file.is_open()){ 
     int size = file.tellg(); 
     filesize= size; 
     memblock = new char [size]; 
     file.seekg (0, ios::beg); 
     file.read (memblock, size); 
     file.close();          

     cout << size << " bytes loaded into memory" << endl; 
     return 1;                    
    } 
    else cout << "Unable to open file" << endl;   
    return 0; 
} 
+0

例外は何行発生しますか?例外の正確なテキストは何ですか? –

+0

2バイトがメモリにロードされます。未処理の例外:System.AccessViolationException:保護されたメモリからの読み取りまたは書き込みを試みました。これはしばしば、他のメモリが壊れていることを示します。 std.basic_streambuf >/{dtor}(basic_streambuf > *) – John

+0

開いているファイルのサイズは約5kです。 – John

答えて

3

ios::binaryを使用していないため、十分なバッファが作成されていません。ファイル内の各'\n''\r\n'に展開されます。バッファのサイズをファイルのバイト数に変更したため、拡張を処理できず、古典的なバッファオーバーランが発生しています。

+0

ありがとうございます – John

+0

これは何が起こっているのですか。 – John

+0

プログラムを_ASSERT(_CrtCheckMemory())でフックしました。バッファオーバーランをローカライズするステートメントこの問題はコードのこのセクションが実行される前に発生していましたが、リリースDLLでは自己宣言されていましたが、デバッグDLLでは表示されませんでした。オーバーランの正確な原因は、argvからmyFileポインタに値をコピーするstrcpy_sでした。提供されたコードサンプルには含まれていませんでした。 myFileを割り当てる私の方法を変更することを余儀なくされました.strcpy_sの任意のバージョンがargvで実行され、ヒープが破損しました。 – John

関連する問題