Boostのshared_ptrのように参照カウントを行うスマートポインタに対し、それを格納する vector 配列を作成して stable_sort を実行すると参照カウントが狂ってしまいます。(sort なら大丈夫です)
サンプルコードをコメントに貼ります。
これは C++ Builder 5.0 の話なのですが、他の環境ではいかがでしょうか?また、これを回避する方法はないでしょうか?
5.0 は手に入らなかったので、5.5 の STL を読んでみました。
memory.stl
template <class ForwardIterator>
_RWSTD_TRICKY_INLINE void __destroy (ForwardIterator first, ForwardIterator last);
がバグってる気がします。
template <class ForwardIterator> _RWSTD_TRICKY_INLINE void __destroy (ForwardIterator first, ForwardIterator last) { while (first != last) ++first; }
これを…
template <class ForwardIterator> _RWSTD_TRICKY_INLINE void __destroy (ForwardIterator first, ForwardIterator last) { while (first != last) { __RWSTD::__destroy(first); ++first; } }
こうすると直ると思います。
「g++ (GCC) 3.4.4 (cygming special) (gdc 0.12, using dmd 0.125)」+「boost-1.33.1」では、問題ありませんでした。
stable_sort 内でメモリーリークしているのかもしれませんね。
これを回避する方法はないでしょうか?
バグ(?)を直すか、STLport 等の C++ Builder 5.0 付属の STL 以外を使うとか…。
いつもありがとうございます!Builder 5.0付属のSTL(RW)の問題ですかねぇ。RWのvectorはいろいろバグが多くて困ります・・・。
ひとまず、上記の動作が異常だということが確認できて良かったです。今からSTLを入れ換えるのはそれはそれでリスキーなので、どうしたものか・・・orz
5.0 は手に入らなかったので、5.5 の STL を読んでみました。
memory.stl
template <class ForwardIterator>
_RWSTD_TRICKY_INLINE void __destroy (ForwardIterator first, ForwardIterator last);
がバグってる気がします。
template <class ForwardIterator> _RWSTD_TRICKY_INLINE void __destroy (ForwardIterator first, ForwardIterator last) { while (first != last) ++first; }
これを…
template <class ForwardIterator> _RWSTD_TRICKY_INLINE void __destroy (ForwardIterator first, ForwardIterator last) { while (first != last) { __RWSTD::__destroy(first); ++first; } }
こうすると直ると思います。
なるほど。デストラクタが呼ばれていないとは思ったのですが、呼んでいなかったのですね・・・。ちょっと試してみてまた結果を御報告します。どうもありがとうございます!
素晴らしい!やってみたところとりあえず上記の問題はうまく解決しました!取り急ぎ御報告まで。
<追記>
問題となっていたプログラム全体の動作にも問題なく、おかげさまで解決できました。本当にありがとうございました。
それにしてもRWのコードを眺めただけでよく分かりますね。あなたは神ですか!(笑)
なるほど。デストラクタが呼ばれていないとは思ったのですが、呼んでいなかったのですね・・・。ちょっと試してみてまた結果を御報告します。どうもありがとうございます!
素晴らしい!やってみたところとりあえず上記の問題はうまく解決しました!取り急ぎ御報告まで。
<追記>
問題となっていたプログラム全体の動作にも問題なく、おかげさまで解決できました。本当にありがとうございました。
それにしてもRWのコードを眺めただけでよく分かりますね。あなたは神ですか!(笑)