次の点を考慮してください。
std::basic_fstream<char> testfile;
testfile.write(reinterpret_cast<const char*>(&someInt), sizeof(int));
testfile.close();
これは、VC 8.0 でビルドすると問題なく動作しますが、VC 10.0 ベータでビルドするとクラッシュします。
VC 8 の動作に実際に依存しているレガシー コードがいくつかあります。ここでは、basic_fstream から継承して機能を追加します。
class myFile : public basic_fstream<char> {
public:
void myWrite(const char* data, std::streamsize len) {
write(data, len);
// update some state variables (checksum, etc)
}
};
ディスク I/O を発生させずに追加の状態を検査することが有益な場合があります (テスト書き込みなど)。
これは未定義の動作だと思いますが、VC 8 でクラッシュしないことは幸運です。そうは言っても、VS 2010 ベータ版を評価する際に十分な問題があったことを確認したいと思います。はっきりと断言できる人はいますか?
編集: VS 2010 のコール スタック:
ostream::write
ostream::sentry ctor
istream::_Sentry_base ctor
fstream::_Lock
_file.c::_lock_file
crashes on EnterCriticalSection( &(((_FILEX *)pf)->lock) ), pf is null
VS 2005 のコール スタック:
ostream::write
ostream::sentry ctor
ostream::_Sentry_base ctor // different
streambuf::_Lock
_Mutex::_Lock()
_Mtxlock in xmtx.c
EnterCriticalSection(_Mtx), where _Mtx is valid
また、Ubuntu で gcc-4.3.3 を使用すると、エラーなしでコンパイルおよび実行されます。
*** 編集:
さらに掘り下げた結果、これは実際には Visual Studio 2010 Beta 1 のバグであることがわかりました。
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=456890
このレポートによると、公式リリース用に修正されています。
ご意見をお寄せいただきありがとうございます。