dtlのpatch関数がLinuxだと落ちる(修正済み)

そういや、ずっと前にParallels Desktop上のUbuntuで動作確認したっきり、Linuxでは動作確認してなかったなあと思いつつ、久々にUbuntuを立ち上げてサンプルプログラムを走らせてみたら、strdiffやintdiff、unidiffに関しては特に問題なかったのだが、fpatchがsegmentation faultを起こした。valgrindを走らせてみると、dtl.hppの141行目がおかしいらしい。で、見てみると、forループ内で、

seqLst.erase(lstIt); // 指定されたstd::listの要素を削除
++lstIt;

orz。正しくはこうだ。

lstIt = seqLst.erase(lstIt);

Effective STL(第9項)によると、std::listは以下でもいい。

seqLst.erase(lstIt++);

上記は連想コンテナ(mapやset)の要素を削除する際に使う。第9項によると、

listに対する正しい方法は何かと疑問に思うかもしれない。実際のところ、繰り返し処理と消去を行うためには、listをvector/string/dequeのように扱うこともできるし、連想コンテナのように扱うこともできる。(【Effective STL 第9項 消去オプションは注意して選択しよう】)

Macだと何故か問題なく動いていた。(STLの実装が微妙に違う?)


というわけで、昨日になりますが、dtl-0.04をリリースしました。上記の(かなり重大な)バグ修正と前に書いた分割diffが取り入れられています。差分が大きい場合、スピードは落ちますが、精度は向上しています。(でも、やっぱり近似とかしたい)


Effective STL―STLを効果的に使いこなす50の鉄則

Effective STL―STLを効果的に使いこなす50の鉄則

  • 作者: スコットメイヤーズ,Scott Meyers,細谷昭
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2002/01
  • メディア: 単行本
  • 購入: 9人 クリック: 155回
  • この商品を含むブログ (94件) を見る