[過去ログ] Boostを語れゴラァ part3 (1001レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
573: 2007/01/09(火)16:49 AAS
>>572
>Statistical Distributions and Mathematical Special Functions
興味あるんだけどどのへん見ればいいの?
ポインティングよろしく
574
(1): 2007/01/09(火)17:14 AAS
外部リンク[php]:boost-consulting.com

math-toolkit-code.tar.bz2
575: 2007/01/09(火)17:25 AAS
>>574
Thanks!
576: 2007/01/09(火)18:12 AAS
>>548-571
通りすがりだけど、このやり取りで、weak_ptrがすっごくよく分かった!
日本語でこれだけちゃんとした説明はどこにもないと思う。ありがとう!
577
(2): 2007/01/10(水)21:17 AAS
shared_ptrなんだけど、中にいれるオブジェクトが消えると
カウントが減りますよね。
でも、中のオブジェクトが消えたということを、shared_ptrはどうやって知るんですか?
代入演算子で上書きされたときについては、代入演算子の多重定義で
上書きされたほうをデクリメントしてるのは分かるんだけど、
スコープを抜けたときとかはshared_ptrには分からんのでは?
リアルタイムにオブジェクトが生きてるかどうかを監視してるわけでもないのに、
スコープ抜けてオブジェクトが自然消滅したときにもちゃんとカウントが
減ってるのって不思議すぎる。これ分かる人いる?
578: 2007/01/10(水)21:25 AAS
>中にいれるオブジェクトが消える

>代入演算子で上書きされたとき

>オブジェクトが生きてるかどうか

この辺が果てしなく意味不明。
>>577はshared_ptrを全く理解していないようだ。
579: 2007/01/10(水)21:55 AAS
ソース読めばわかるよ
580
(1): 2007/01/10(水)21:57 AAS
>577
デストラクタ
581
(2): 2007/01/11(木)07:38 AAS
shared_ptr<A> hoge(new A);
int i = 1;
while(i--){
shared_ptr<A> hogehoge(new A);
hoge = hogehoge;
cout << hoge.use_count() << endl;
}
cout << hoge.use_count() << endl;

こういう状態のとき、二番目のhoge.use_count()のときにはカウントが
一番目より一つ減るでしょ。それをhogeのカウンタはどうやって把握したの?
ってことを聞きたかったんです。
カウンタのデクリメントについては、ソースを読めば代入演算子の
部分で、代入元をインクリメントして代入先をデクリメントするってことが
書いてあるけど、代入したオブジェクトそのものが上のコードみたいに
スコープはずれて消えたときにデクリメントする処理なんて書いてないな、
と思ったんです。

>>580

代入元のデストラクタですか?
どうやって代入元のデストラクタで、shared_ptrのカウントを下げてるか分かりますか??
582: 2007/01/11(木)08:09 AAS
>>581
カウンタもshared_ptrが保持するポインタと同じく共有されるよ。
shared_ptr<A> hogehoge(new A); //カウント1
hoge = hogehoge; //カウント2
} //hogehogeの破棄によってカウント1
その後hogeの破棄時にカウントが0になるのでdeleteが呼ばれる。
583
(1): 2007/01/11(木)09:19 AAS
初歩的な質問で申し訳ないけれど、
shared_ptrはコンストラクタではいろんなオブジェクトを受け付けるけど
代入はスマートポインタしか受け付けないってのは正しい?
いちど初期化してしまうと、
あとから別のオブジェクトを入れるには他のshared_ptrにいれてから
本当に入れたいshared_ptrにそのshared_ptrを代入するしかありませんか?
584
(1): 2007/01/11(木)09:41 AAS
>>581
もうね、
> int i = 1
> while(i--){
の時点でC++理解してなさすぎ。

{
  shared_ptr<A> hogehoge(new A);
  hoge = hogehoge;
  cout << hoge.use_count() << endl;
}

これだけでスコープ限定できるの。
boostを理解しようなんて百年早い。
基礎からやり直しな。
585: 2007/01/11(木)09:55 AAS
C++っていうかC
586: 2007/01/11(木)10:01 AAS
>>584

んなどうでもいいことよりも少しは本質的な話をしたらどう
587
(1): 2007/01/11(木)10:03 AAS
do{
hogehoge();
}while(0);

hogehoge()は実行されますか?
588: 2007/01/11(木)10:28 AAS
>>587

それは別のスレで質問したらいいと思う
589
(2): 2007/01/11(木)10:45 AAS
>>583
reset すれば?
590: 2007/01/11(木)10:47 AAS
お前らと仲良くなりたくて、もっと weak_ptr について理解を
深めようと思ったが、頭が悪すぎて理解できなかった。

なんかやばそうだから循環参照が起きないように気をつけよう、
その程度の理解な俺が作っているプログラムを使わされている
やつカワイソス。
591: 2007/01/11(木)10:49 AAS
ちなみに俺の理解では weak_ptr は参照カウントを増減させないので
たとえ weak_ptr で参照されていたとしても実体が delete されて
いるかもしれん。だから weak_ptr の参照先が生きてるかどうか
ちゃんとチェックしてから使おうね、ってことなんだが。
592
(2): 2007/01/11(木)10:51 AAS
生のポインタじゃなくて weak_ptr を使う理由は、
参照先のオブジェクトの生死を追跡することが出来るから。

えっと、ほかにうれしさある?
593: 2007/01/11(木)11:09 AAS
>>592

おれもよく分からんのだけど、読んだりしらべたりした感じだと
循環参照でカウントが不当に上がってしまわないように
shared_ptrの相互参照は片方をweak_ptrにしないと駄目ってことも
あるんじゃないだろうか。違ってたらまた指摘よろ
594: 2007/01/11(木)11:11 AAS
>>589

reset()か。ちょっと試してみる
595
(1): 2007/01/11(木)11:24 AAS
>>589

reset()した後に、そのshared_ptrをどうやって再利用したらいいんだろう。
596
(1): 2007/01/11(木)11:57 AAS
shared_ptrみたいな簡単な部類すら理解できないのに
boostを使おうなんて100年早い
597: 2007/01/11(木)12:08 AAS
>>596
それでも BGL は便利にがんがんつかわせてもらってます ><
598: 2007/01/11(木)16:02 AAS
>>595
shared_ptr p1( object1 );
p1.reset( object2 );

shared_ptr のインターフェイス定義くらい読んでおけよ。
599: 2007/01/11(木)16:28 AAS
>>592
他に,対象のオブジェクトを参照している最中に
(そのオブジェクトを指している shared_ptr が全て消えることで)
突然そのオブジェクトが死んでしまうような事態を回避することができます.
(この問題はマルチスレッドプログラムで特に顕著だと思いますけれど,
シングルスレッドプログラムでも論理的にはありえるケースです)

void process( weak_ptr< Obj > wp )
{
  if( shared_ptr< Obj > p = wp.lock() ){
    // このスコープ内では, (たとえば他の実行スレッドの動作によって)
    // p の指しているオブジェクトが削除されるようなことはない
  }
  else{
    // wp が指しているオブジェクトが死んでいる場合.
    // ここでどうするかは何を実装するかによります.
    // wp の参照先が常に生存していることが不変条件ならば,
    // 571さんの書いているように論理エラーを通知する (例外を送出する) ことに
    // なるでしょうし,参照先のオブジェクトが死んでいることを検出して
    // 他のアクションを取るようなことも,場合によっては想定されます.
  }
}
600: 2007/01/11(木)16:30 AAS
また,自身は shared_ptr を必要としないけれど,他の誰かに
shared_ptr を渡すような要求がある場合に weak_ptr が必要になります.

// 自身は B のオブジェクトへの (弱い) 参照を持っているだけで良いが,
// B のオブジェクトへの shared_ptr を返すインタフェイスが必要なクラス
class A{
public:
  shared_ptr< B > getB() const{ return boost::shared_ptr< B >( p_ ); }
private:
  weak_ptr< B > p_;
};

あと weak_ptr の使い方として典型的なのが,参照先のオブジェクトが
死んでいてもかまわないような場合です. proxy (特にキャッシュの実装) や
observer などの実装で有用な使い方があるかと思います.
601: 2007/01/11(木)17:17 AAS
shared_ptr はソースはそんなに複雑ではないわりに、
enable_shared_from_this や、weak_ptr、shared_ptr<void>、カスタム削除子 への対応など
細かいところでさまざまな工夫が施されているから、一度ソースに目を通しておくと勉強になる。
602: 2007/01/11(木)19:49 AAS
削除子は勉強になったなぁ
1-
あと 399 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.017s