人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

【C++ STL バグ?】追試してくれる方を探しています。

Boostのshared_ptrのように参照カウントを行うスマートポインタに対し、それを格納する vector 配列を作成して stable_sort を実行すると参照カウントが狂ってしまいます。(sort なら大丈夫です)

サンプルコードをコメントに貼ります。

これは C++ Builder 5.0 の話なのですが、他の環境ではいかがでしょうか?また、これを回避する方法はないでしょうか?

●質問者: you1982
●カテゴリ:コンピュータ インターネット
✍キーワード:Boost Builder C++ STL Vector
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● しおり
●100ポイント

「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


2 ● しおり
●200ポイント ベストアンサー

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のコードを眺めただけでよく分かりますね。あなたは神ですか!(笑)

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ