次の点を考慮してくださいデフォルトで構築されたfstreamへの書き込み:未定義の動作?
std::basic_fstream<char> testfile;
testfile.write(reinterpret_cast<const char*>(&someInt), sizeof(int));
testfile.close();
これは、VC 8.0で構築されたときに無苦情を実行しますが、VC 10.0ベータ版で構築されたときにクラッシュします。
私は実際に私たちは機能を追加するためにbasic_fstreamから継承VC 8の動作に依存しているいくつかのレガシーコードを持っている:
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ベータ版を評価していることが分かりました。そこにいる人は確実に言うことができますか?
EDIT:VS 2010でスタックを呼び出します:VS 2005
ostream::write
ostream::sentry ctor
istream::_Sentry_base ctor
fstream::_Lock
_file.c::_lock_file
crashes on EnterCriticalSection(&(((_FILEX *)pf)->lock)), pf is null
コールスタック:
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でエラーなしで実行されます。
*** EDIT:
より掘削した後、これが実際には、この報告書によると、Visual Studioで2010ベータ1
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=456890
バグです、それがされていることが表示されます正式リリースのために修正されました。
入力いただきありがとうございます。
私は、rdbufとしてヌルポインタを与えられたostreamに書き込むのはUBではないことが分かります。ostream os(0); os << "hello";すべての出力操作がbadbitを最初にチェックし、その場合は何もしないため、有効です。ストリームがヌルポインタによってバッファとして初期化されている場合、Badbitを設定します。 (一部の機能はまた、明示的に)(RDBUFの値をテストします。私は、これは当時ストリームが、私はIIRC結論に達していなかったファイルに対してどのように動作するかをルックアップしてみました。出力シーケンスがある場合にかかわらず、多くの機能は、」言います...」ファイルストリームが開いていない持つことができているようだ。 –
? – xtofl
ああ....未定義の動作のための 『UB』スタンドを何! – xtofl