これは、バッファを設定する ostream のサブクラスを定義する便利な方法です (MyStreamBuf は std::streambuf のサブクラスです)。
class MyOStream : public std::ostream {
public:
MyOStream(): std::ostream(&buffer) {}
// ...
private:
MyStreamBuffer buffer;
};
ここで std::ostream のコンストラクターは buffer のコンストラクターの前に呼び出されるため、渡される streambuf* は仮想メソッドを持つ構築されていないオブジェクトを指しています。std::ostream の前にバッファが破棄されるため、同じ問題が ~MyStream() にも当てはまります。そのため、std::ostream のデストラクタは、破棄されたバッファ オブジェクトを参照します。
標準では std::ostream がコンストラクタとデストラクタでバッファのメソッドを呼び出すことを許可していないため、この手法は安全であると聞いています。本当?
問題は、これが標準ライブラリの現在の実装で実際に機能するかどうかではなく、標準によって機能することが保証されているかどうかであることに注意してください。問題は、問題を回避するために上記のコードを書き直す方法でもありません。たとえば、多重継承を使用して、std::ostream スーパー クラスの前にスーパー クラスとして構築されるバッファを取得します。