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)