トップ «前の日記(2004-12-02(木)) 最新 次の日記(2004-12-04(土))» 編集

とた日記


2004-12-03(金) 晴 安静時心拍数 48 [長年日記]

_ ostrstream の freeze メソッド

ostrstream で str() メソッドを使っている箇所でメモリリークしてるなぁと思ったら

std::ostrstream ostr ;

ostr << a ;

std::string aaa = ostr.str() ; // で、できます。でも、

ostr.freeze( false ) ; // <- これが無いとメモリリークするのでご注意を。

[http://mtakahashi.com/old/a3750.htmlより引用]

ということでハマっていたようです。

ここで, str() を呼ぶと. ポインタの所有権は,

呼び出し側に委譲されるということを知らないユーザが多い.

しかし, だからといって, delete [] r として消すのは,

どうやってメモリがアロケートされたか保証できないので安全ではない.

ここでのカラクリは, str() を呼ぶと, 暗黙に freeze(true) が呼ばれるということ.

凍結, すなわち, この後 stream の中身に一切の変更が許されなくなる.

でも, 手動で解凍 freeze(false) すれば, 自分のものに戻すことができる.

[きまぐれ日記: stdより引用]

ということでした。ostrstream は obsolete なので stringstream に書き換えて一件落着です。その他の STL でハマリどころはないのかな?

_ portupgrade java/eclipse devel/glib20 x11-toolkits/gtk20 devel/p5-IO-String mail/razor-agents

eclipse-3.0.1_1             <  needs updating (port has 3.0.1_2)
glib-2.4.7                  <  needs updating (port has 2.4.8)
gtk-2.4.13                  <  needs updating (port has 2.4.14)
p5-IO-String-1.05           <  needs updating (port has 1.06)
razor-agents-2.61_3         <  needs updating (port has 2.66)