2016-08-24 5 views
2

STL <ios>ライブラリ関数この関数はrdbuf(...)はポインタを返します - 指しているバッファを所有していますか?

streambuf* std::basic_ios::rdbuf (streambuf* sb);

あり、ストリームに関連付けられたストリームバッファを変更するために使用することができます。これを使用すると、以前使用されていたstreambufへのポインタが返されます。誰がポインターを所有しているのか、その生涯が何であるのかははっきりしない。標準(27.5.5.3/5)は単に

と返されます。前の値はrdbuf()です。

これはあまり有益ではありません。このポインタが有効である期間について保証はありますか?呼び出しコードはdeleteで終わったら一度それをしなければなりませんか?

答えて

4

バッファは、最初にバッファをストリームオブジェクトにインストールした人が所有します。ストリームオブジェクトには内部バッファが付属しており、デフォルトで作成されたストリームオブジェクトはデフォルトでそれを使用します。

したがって、rdbuf()メソッドを使用してコードで明示的に非デフォルトバッファがインストールされていない限り、ストリームオブジェクトが存在する限りバッファが有効であるという答えです。

バッファをインストールしていない場合は、明らかにdeleteではありません。

+0

ありがとうございます - この動作はどこかの規格で指定されていますか? – Mohan

+0

明示的にはありません。 rdbuf()が返すバッファの所有者は指定されていません。明らかに、発信者がそれを所有していなければ、それを削除することはできません。 –

+0

重要:もしあなたがバッファをインストールし、それを 'new'で割り当てたとしても、ストリームがそれで終わるまで、バッファを' delete'しないでください。 – MSalters

関連する問題