C++/STL

Last modified: 2009-09-05

C++ と STL(標準テンプレートライブラリ)に関する(1998年頃に書いた)記事。

News


g++ の使用


g++ による STL の使用


STLport

最近つかっているのは libstdc++ の STL ではなくて、 http://corp.metabyte.com/~fbp/stl/ の STLport3.01 です。これは SGI による STL を (libstdc++のチームとは独立して)移植したもののようです。

STL_DEBUG など、さまざまなオプションが使えるのが特長です。 まだ使いこなせてないのですが。

STLport には string クラスは含まれておらず、 SGI 独自の rope というライブラリが入っています。
私は Modena の bstring.h を使ってます。


STLport のデバッグ支援機能

# 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 を
使っていたことが判明。

STLport + Modena bstring.h におけるデバッグ

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 とかが好きになるかも。

Takuya NISHIMOTO