0

これは私の作業コードです:

size_t FileReader::Read(ByteVector& output)
{
    output.resize(m_elementSize * m_blockSize);
    size_t read = fread(&output[0], m_elementSize, m_blockSize, m_file);
    output.resize(read);
    return read;
}

ただし、以前はコードを試しましたoutput.reserve(m_elementSize * m_blockSize);

私の知る限りreserve、コンテナのメモリに場所が見つかりました。resize同じことを行い、メモリをゴミ箱から特定の値に変更し、コンテナのサイズを変更します。

fread最初のパラメーターはvoid *で、それは私の質問と同じです。unsigned char *呼び出し中に例外が発生したのはなぜですかfread

なぜそれが起こっているのですか?void ポインタを取り、クラスfreadを使用してメモリに書き込まないためです。vector

PSは言及するのを忘れていましたtypedef std::vector<unsigned char> ByteVector

4

2 に答える 2

4

ベクトルが最初に空の場合、output[0](予約したスペースの量に関係なく) 未定義の動作が呼び出され、一部のプラットフォームでは例外がスローされる場合があります。

于 2013-08-21T12:32:22.493 に答える
1

問題が見つかりました。今、私は作業と呼んだコードを使用しています

resizeメモリ内のデータで動作するので余計なものは避けたかったのですが、afterreserve output[0]は存在しません。

さらに、読み取りvectorサイズがゼロになり、resize読み取りデータが破壊されます。

于 2013-08-21T12:39:00.647 に答える