C++ と STL(標準テンプレートライブラリ)に関する(1998年頃に書いた)記事。
strip a.out
とすれば実行ファイルをコンパクトにすることができます。
STL_DEBUG など、さまざまなオプションが使えるのが特長です。 まだ使いこなせてないのですが。
STLport には string クラスは含まれておらず、
SGI 独自の rope というライブラリが入っています。
私は Modena の
bstring.h
を使ってます。
# define __STL_DEBUG と書いておくと、たとえばこんなエラーを吐いてくれる。 /STLport/stl_vector.h:532 STL error : Container doesn't own the iterator /STLport/stl_vector.h:352 STL assertion failure: position.nonsingular(this) デバッガで追ってみたら、初期化されていない iterator を 使っていたことが判明。
string s1, s2; みたいに宣言されているとき、この中身は gdb でどうやって追うのか? (gdb) p s1 $1 = {c_str_ptr = 0x0, reference = 0x1400292a0} (gdb) p s2 $2 = {c_str_ptr = 0x0, reference = 0x140029300} (gdb) p s1.reference $3 = (t16basic_string_ref1Zc *) 0x1400292a0 (gdb) p *s1.reference $4 = {ptr = 0x140027b80 "url=http://search.yahoo.co.jp%2Fbin%2Fsearch", len = 44, res = 44, count = 2} (gdb) p *s2.reference $5 = {ptr = 0x140027c00 "p=%89%C8%8C%A4%94%EF", len = 20, res = 20, count = 2} ようするに ・ c_str_ptr が 0x0 でなければ *s1.c_str_ptr ・ c_str_ptr が 0x0 ならば *s1.reference ここで len が 0 なら、本当に空文字列。 で、string クラスの中身を見ることができる、ようですねえ。。 こういうのが面倒になってくると、Visual C++ 5.0 とかが好きになるかも。