- 1 名前:デフォルトの名無しさん [2008/02/27(水) 02:03:30 ]
- C++標準ライブラリの一つ、STLについて。
前スレ 【C++】STL(Standard Template Library)相談室 8 pc11.2ch.net/test/read.cgi/tech/1198435319/ 過去ログ・リンク・書籍紹介は >>2 以降
- 531 名前:デフォルトの名無しさん [2008/05/21(水) 21:31:09 ]
- 唐突で申し訳ありませんが、以下、2点質問させてください。
ご意見で結構なので、よろしくお願いします。 @eraseで、listから登録しているクラスのポインタを削除した場合に、 →リストから削除したクラスのデストラクタはコールされる? リストから要素のみ削除されると理解していたのですが、 VC6.0のSTLのドキュメントを読んだところ、 N回のeraseでN回のデストラクタが呼ばれると書いてあったため困惑中。 Aマルチスレッドアプリでコンテナなどを用いるのは危険?(VC6.0を想定) →MSDNにて、eraseを複数のスレッドから同時に実行するとデッドロックする という記載等があったため、少なくともVC6.0のSTLは マルチスレッドアプリを作る上で適当でないと思い始めている段階。 実際、beginなどの引数なし関数コール時にアプリが落ちた経緯あり
- 532 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 21:37:54 ]
- 「listから登録しているクラスのポインタを削除」の意味がワカラン
こういう日本語もワカル人がいるので不思議 そういう人を待て
- 533 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 21:41:21 ]
- std::list<T>なら、eraseしたときに該当するオブジェクトのデストラクタが呼ばれる。
std::list<T*>なら、該当するオブジェクトとはlistの要素たるT*のオブジェクトであり、 T自体のデストラクタは呼ばれない。 Tオブジェクトのデストラクタが呼ばれるようにしたければ、 boost::shared_ptrでも使えというのがC++の現状。
- 534 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 21:42:41 ]
- >>531
1. について ポインタ要素を erase してもデストラクタは呼ばれません。 実体を格納している場合には erase でデストラクタが呼ばれます。 2. について 読み取り専用なら安全です。更新があるなら、明示的に排他制御 しましょう。
- 535 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 00:29:50 ]
- >>533 534
回答ありがとうございます。 概ね、当方の理解と一致しており、胸を撫で下ろしました。 質問事項Aのマルチスレッドでの使用に関しては、 別スレッドでswap/uniqeなどで iterator iの参照先の内容が変わることを考慮すると、 begin等も容易には使えないですね。 ちなみに、今、他人のソースをレビュー中でして、 人のソースを見ていると、自分の理解が正しいのかどうか ちょっと不安になってきたりと・・・oTL
- 536 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 01:10:30 ]
- >>535
unique後はそもそもイテレータが無効になるから、マルチスレッド以前の問題だね。
- 537 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 01:33:51 ]
- >>535
スレッド安全性については規格では何も規定していないから、実装ごとにドキュメントを 読む必要がある。ドキュメントに記載がなければ、同時アクセスは一切できないものと 考えたほうがいい。そういう実装もあるので、最大限の移植性が必要なら同時アクセスは 一切できないものと考えるべき。
- 538 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 12:03:22 ]
- Intel謹製のスレッドセーフSTLがあったような・・・
あとポインタ格納しつつeraseしてもデストラクトする実装ならboost::ptr_listってのがある
- 539 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 20:39:50 ]
- >>537
自分もそうおもふ
- 540 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 21:56:49 ]
- VC 7.1以降だと文書化されている。
msdn.microsoft.com/en-us/library/c9ceah3b.aspx あるオブジェクトについて、同時読取り可、単一スレッドの書込み可。 同時書込みや読み書き同時は不可。 スレッドごとに別のオブジェクトを読み書きするのは問題ない。 例外的にストリーム出力は同時書込み可。
|

|