0

メモリバッファを使用してファイルに書き込んでいます。各レコードをメモリバッファにコピーしてから、ディスクにフラッシュします。

コード:

    char * OutBuffer;
    char *pt;
    OutBuffer = new char(BufferSize);
    pt = OutBuffer;

    for (int i=0; i<(FileSize / RECORD_SIZE); i++){
        if (((i % recordsPerBlock)==0) && (i>0)){
           FileSortHandle->write(OutBuffer, BufferSize);
           pt = OutBuffer;
        }
        else{
           memcpy(pt, minRecord, RECORD_SIZE);
           pt = pt + RECORD_SIZE;
        }
           minRecord = nullptr;
    }

「FileSortHandle->write(OutBuffer、BufferSize);」を呼び出すと VSは次のことを示しています。

「WindowsがSTL_Test2.exeでブレークポイントをトリガーしました。

これは、ヒープの破損が原因である可能性があります。これは、STL_Test2.exeまたはロードされたDLLのいずれかにバグがあることを示しています。

これは、STL_Test2.exeにフォーカスがあるときにユーザーがF12キーを押したことが原因である可能性もあります。

出力ウィンドウには、より多くの診断情報が表示される場合があります。」

誰かが私を助けることができますか?

4

1 に答える 1

8
OutBuffer = new char(BufferSize);

これにより、1文字だけにメモリが割り当てられます。この1文字が初期化されるため、が大きすぎるBufferSizeとオーバーフローが発生する可能性があります。BufferSizechar

あなたがおそらく意味したのはこれです:

OutBuffer = new char[BufferSize]; //use square brackets!

BufferSizecharにメモリを割り当てます。バッファは初期化されていません。


これは問題とは関係ありませんが、可能であれば、ポインタを宣言するときにメモリを割り当てることをお勧めします。

char * OutBuffer = new char [BufferSize];
char *pt = OutBuffer; //prefer initialization over assignment

つまり、割り当てよりも初期化を優先します。

于 2012-07-09T17:32:08.523 に答える