2

免責事項: これは初心者向けの別のタスクであるため、異なるコンパイラや異なるアーキテクチャでは、結果として異なる (互換性のない) バイナリが得られる可能性があるという事実を理解しています。したがって、この特定のマシンでのみ機能することは問題ありません。

size_t私はバイナリファイルから読み書きしています。書き込みは次のようになります。

std::string result;
result.append((char *)&block_size_, sizeof(block_size_));

その後すぐにresultファイルに書き込まれます。

しかし、同じように読むと:

map_binary.copy((char *)&block_size_, sizeof(block_size_), offset);

警告が表示されます

warning C4996: 'std::basic_string<_Elem,_Traits,_Alloc>::copy': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>,
1>              _Alloc=std::allocator<char>
1>          ]
1>          c:\program files (x86)\microsoft visual studio 11.0\vc\include\xstring(1777) : see declaration of 'std::basic_string<_Elem,_Traits,_Alloc>::copy'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>,
1>              _Alloc=std::allocator<char>
1>          ]

このコードが安全でない理由がわかりません。問題がまったくないふりをする以外の解決策を探しています (を使用-D_SCL_SECURE_NO_WARNINGS)。

それで、私は何が欠けていますか?

PS: 現在、私は標準ライブラリのみを使用して C++ を学習しているため、boostまたはその他のものを使用するソリューションは受け入れられません。

4

1 に答える 1

1

あなたは何も見逃していません。ポインターに何かをコピーすると、VC++ は非常に警告を発します。この場合、宛先のサイズが正しくなるという保証はありません。結局のところ、このようなものを書いた後map_binary.copy((char *)&block_size_, 4, offset);、コードが 64 ビット コンパイラで失敗することに気付くかもしれません。

この種のエラーを回避できることに満足している場合は、警告を無効にするか無視してください。

于 2012-10-18T09:21:35.660 に答える