2

次の点を考慮してください。

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

このレポートによると、公式リリース用に修正されています。

ご意見をお寄せいただきありがとうございます。

4

1 に答える 1

2

ストリームの状態が失敗または不良に設定されているときに例外のスローが有効になっているかどうかを確認しましたか?C ++標準では、次のabt'write' methdodと書かれているためです:-

27.6.2.7。フォーマットされていない出力関数

ポイント:-5

basic_ostream& write(const char_type* s, streamsize n);

効果:フォーマットされていない出力関数として動作します(27.6.2.7の段落1で説明されています)。歩哨オブジェクトを作成した後、最初の要素がsで指定されている配列の連続する場所から挿入する文字を取得します。次のいずれかが発生するまで、文字が挿入されます。

  • n文字が挿入されます。
  • 出力シーケンスへの挿入は失敗し(この場合、関数はsetstate badbitを呼び出します)、ios_base :: failure(27.4.4.3)をスローする可能性があります)。

これは、せいぜいtestfile.fail()trueを返すことを意味します。理想的にはクラッシュしないはずです。例外がスローされてキャッチされていないのではないかと思います(しかし、私は完全に間違っているかもしれません)。

于 2009-09-02T05:55:40.817 に答える