Entry

リーク探しもうヘロヘロ

2009年02月27日

他人が書いた初見のコードがリークしているということで,今日探していたんですけれど,見つからない……。リークしてるのは少なくて,ほんの2バイトか3バイトくらいなんですけれど,多かろうが少なかろうが,豪快に assert が出るので,対応しなくちゃいけません。ほとんど泣きが入ってます。

あたしのひそかな特技に「リーク探しがうまい」という自己満足があるんですけれど,今回は本当にヘロヘロです。細かいオブジェクトの領域が大量にコマコマと確保されていて,そのオブジェクトがあちこちの異なるクラスで管理されている。

とりあえず,メモリ管理で次のことをやられるとツライ。

  • RAIIに則っていない。
  • 確保した領域を指すポインタ(のコンテナ)をメンバに持つクラスがあちこちにある。
  • コンテナに入っている要素の数をコンテナの外部で管理している(有効な要素とそうでない要素のような色分けがあるらしい)。

今回のリーク,3番目の確保している領域数の数え方が原因になっているところまでは判明しました。どうもコンテナからは pop されているけれど,それが管理外になっているみたい。しかし,これがまた別のクラスで管理されちゃったりするもんで,結局どこのクラスが責任持ってこのリソースを解放するのか謎。

RAII の話で言うと,何の脈絡もないメソッド内でひょんな拍子にいきなり new してコンテナに詰め込んだりしています。new されるタイミングがまちまちで,しかも delete されるタイミングも(同じコンテナで管理しているにもかかわらず)まちまちだったりする。C++ に限らず,C でも new/malloc(3) を書いたら,対応する delete/free(3) を書きましょう,といった話があるわけだけれど,それに照らすと,もはやリークしてくれと言わんばかりのコードに見える……。死にそうです。

今日は,boost::any の実装話でも書こうかと思ったんですけど,ちと体力的に限界。明日もリーク探しか……気が重いです。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN