[過去ログ]
Boostを語れゴラァ part3 (1001レス)
Boostを語れゴラァ part3 http://echo.5ch.net/test/read.cgi/tech/1158991211/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
577: デフォルトの名無しさん [] 2007/01/10(水) 21:17:34 shared_ptrなんだけど、中にいれるオブジェクトが消えると カウントが減りますよね。 でも、中のオブジェクトが消えたということを、shared_ptrはどうやって知るんですか? 代入演算子で上書きされたときについては、代入演算子の多重定義で 上書きされたほうをデクリメントしてるのは分かるんだけど、 スコープを抜けたときとかはshared_ptrには分からんのでは? リアルタイムにオブジェクトが生きてるかどうかを監視してるわけでもないのに、 スコープ抜けてオブジェクトが自然消滅したときにもちゃんとカウントが 減ってるのって不思議すぎる。これ分かる人いる? http://echo.5ch.net/test/read.cgi/tech/1158991211/577
578: デフォルトの名無しさん [sage] 2007/01/10(水) 21:25:23 >中にいれるオブジェクトが消える >代入演算子で上書きされたとき >オブジェクトが生きてるかどうか この辺が果てしなく意味不明。 >>577はshared_ptrを全く理解していないようだ。 http://echo.5ch.net/test/read.cgi/tech/1158991211/578
579: デフォルトの名無しさん [sage] 2007/01/10(水) 21:55:07 ソース読めばわかるよ http://echo.5ch.net/test/read.cgi/tech/1158991211/579
580: デフォルトの名無しさん [sage] 2007/01/10(水) 21:57:28 >577 デストラクタ http://echo.5ch.net/test/read.cgi/tech/1158991211/580
581: デフォルトの名無しさん [] 2007/01/11(木) 07:38:26 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のカウントを下げてるか分かりますか?? http://echo.5ch.net/test/read.cgi/tech/1158991211/581
582: デフォルトの名無しさん [sage] 2007/01/11(木) 08:09:28 >>581 カウンタもshared_ptrが保持するポインタと同じく共有されるよ。 shared_ptr<A> hogehoge(new A); //カウント1 hoge = hogehoge; //カウント2 } //hogehogeの破棄によってカウント1 その後hogeの破棄時にカウントが0になるのでdeleteが呼ばれる。 http://echo.5ch.net/test/read.cgi/tech/1158991211/582
583: デフォルトの名無しさん [] 2007/01/11(木) 09:19:43 初歩的な質問で申し訳ないけれど、 shared_ptrはコンストラクタではいろんなオブジェクトを受け付けるけど 代入はスマートポインタしか受け付けないってのは正しい? いちど初期化してしまうと、 あとから別のオブジェクトを入れるには他のshared_ptrにいれてから 本当に入れたいshared_ptrにそのshared_ptrを代入するしかありませんか? http://echo.5ch.net/test/read.cgi/tech/1158991211/583
584: デフォルトの名無しさん [sage] 2007/01/11(木) 09:41:04 >>581 もうね、 > int i = 1 > while(i--){ の時点でC++理解してなさすぎ。 { shared_ptr<A> hogehoge(new A); hoge = hogehoge; cout << hoge.use_count() << endl; } これだけでスコープ限定できるの。 boostを理解しようなんて百年早い。 基礎からやり直しな。 http://echo.5ch.net/test/read.cgi/tech/1158991211/584
585: デフォルトの名無しさん [sage] 2007/01/11(木) 09:55:44 C++っていうかC http://echo.5ch.net/test/read.cgi/tech/1158991211/585
586: デフォルトの名無しさん [sage] 2007/01/11(木) 10:01:40 >>584 んなどうでもいいことよりも少しは本質的な話をしたらどう http://echo.5ch.net/test/read.cgi/tech/1158991211/586
587: デフォルトの名無しさん [sage] 2007/01/11(木) 10:03:37 do{ hogehoge(); }while(0); hogehoge()は実行されますか? http://echo.5ch.net/test/read.cgi/tech/1158991211/587
588: デフォルトの名無しさん [sage] 2007/01/11(木) 10:28:53 >>587 それは別のスレで質問したらいいと思う http://echo.5ch.net/test/read.cgi/tech/1158991211/588
589: デフォルトの名無しさん [sage] 2007/01/11(木) 10:45:07 >>583 reset すれば? http://echo.5ch.net/test/read.cgi/tech/1158991211/589
590: デフォルトの名無しさん [] 2007/01/11(木) 10:47:47 お前らと仲良くなりたくて、もっと weak_ptr について理解を 深めようと思ったが、頭が悪すぎて理解できなかった。 なんかやばそうだから循環参照が起きないように気をつけよう、 その程度の理解な俺が作っているプログラムを使わされている やつカワイソス。 http://echo.5ch.net/test/read.cgi/tech/1158991211/590
591: デフォルトの名無しさん [] 2007/01/11(木) 10:49:54 ちなみに俺の理解では weak_ptr は参照カウントを増減させないので たとえ weak_ptr で参照されていたとしても実体が delete されて いるかもしれん。だから weak_ptr の参照先が生きてるかどうか ちゃんとチェックしてから使おうね、ってことなんだが。 http://echo.5ch.net/test/read.cgi/tech/1158991211/591
592: デフォルトの名無しさん [] 2007/01/11(木) 10:51:18 生のポインタじゃなくて weak_ptr を使う理由は、 参照先のオブジェクトの生死を追跡することが出来るから。 えっと、ほかにうれしさある? http://echo.5ch.net/test/read.cgi/tech/1158991211/592
593: デフォルトの名無しさん [] 2007/01/11(木) 11:09:46 >>592 おれもよく分からんのだけど、読んだりしらべたりした感じだと 循環参照でカウントが不当に上がってしまわないように shared_ptrの相互参照は片方をweak_ptrにしないと駄目ってことも あるんじゃないだろうか。違ってたらまた指摘よろ http://echo.5ch.net/test/read.cgi/tech/1158991211/593
594: デフォルトの名無しさん [] 2007/01/11(木) 11:11:17 >>589 reset()か。ちょっと試してみる http://echo.5ch.net/test/read.cgi/tech/1158991211/594
595: デフォルトの名無しさん [] 2007/01/11(木) 11:24:52 >>589 reset()した後に、そのshared_ptrをどうやって再利用したらいいんだろう。 http://echo.5ch.net/test/read.cgi/tech/1158991211/595
596: デフォルトの名無しさん [sage] 2007/01/11(木) 11:57:10 shared_ptrみたいな簡単な部類すら理解できないのに boostを使おうなんて100年早い http://echo.5ch.net/test/read.cgi/tech/1158991211/596
597: デフォルトの名無しさん [sage] 2007/01/11(木) 12:08:07 >>596 それでも BGL は便利にがんがんつかわせてもらってます >< http://echo.5ch.net/test/read.cgi/tech/1158991211/597
598: デフォルトの名無しさん [sage] 2007/01/11(木) 16:02:41 >>595 shared_ptr p1( object1 ); p1.reset( object2 ); shared_ptr のインターフェイス定義くらい読んでおけよ。 http://echo.5ch.net/test/read.cgi/tech/1158991211/598
599: デフォルトの名無しさん [sage] 2007/01/11(木) 16:28:02 >>592 他に,対象のオブジェクトを参照している最中に (そのオブジェクトを指している shared_ptr が全て消えることで) 突然そのオブジェクトが死んでしまうような事態を回避することができます. (この問題はマルチスレッドプログラムで特に顕著だと思いますけれど, シングルスレッドプログラムでも論理的にはありえるケースです) void process( weak_ptr< Obj > wp ) { if( shared_ptr< Obj > p = wp.lock() ){ // このスコープ内では, (たとえば他の実行スレッドの動作によって) // p の指しているオブジェクトが削除されるようなことはない } else{ // wp が指しているオブジェクトが死んでいる場合. // ここでどうするかは何を実装するかによります. // wp の参照先が常に生存していることが不変条件ならば, // 571さんの書いているように論理エラーを通知する (例外を送出する) ことに // なるでしょうし,参照先のオブジェクトが死んでいることを検出して // 他のアクションを取るようなことも,場合によっては想定されます. } } http://echo.5ch.net/test/read.cgi/tech/1158991211/599
600: デフォルトの名無しさん [sage] 2007/01/11(木) 16:30:05 また,自身は 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 などの実装で有用な使い方があるかと思います. http://echo.5ch.net/test/read.cgi/tech/1158991211/600
601: デフォルトの名無しさん [sage] 2007/01/11(木) 17:17:34 shared_ptr はソースはそんなに複雑ではないわりに、 enable_shared_from_this や、weak_ptr、shared_ptr<void>、カスタム削除子 への対応など 細かいところでさまざまな工夫が施されているから、一度ソースに目を通しておくと勉強になる。 http://echo.5ch.net/test/read.cgi/tech/1158991211/601
602: デフォルトの名無しさん [sage] 2007/01/11(木) 19:49:50 削除子は勉強になったなぁ http://echo.5ch.net/test/read.cgi/tech/1158991211/602
603: デフォルトの名無しさん [sage] 2007/01/11(木) 20:18:15 今回の人の場合、ソース読むよりスマートポインタのことが書かれた 適当な本読んだほうがよくねえか? いやおまいらが親切なのはよくわかったけどさ http://echo.5ch.net/test/read.cgi/tech/1158991211/603
604: デフォルトの名無しさん [sage] 2007/01/11(木) 20:31:23 カウンタを共有するのがポイント http://echo.5ch.net/test/read.cgi/tech/1158991211/604
605: デフォルトの名無しさん [sage] 2007/01/11(木) 20:56:40 >>603 >適当な本読んだほうがよくねえか? そういう本ある?自分は見たことないんだけれど http://echo.5ch.net/test/read.cgi/tech/1158991211/605
606: デフォルトの名無しさん [sage] 2007/01/11(木) 21:08:05 超定番ながらModern C++ Designじゃないかね? http://echo.5ch.net/test/read.cgi/tech/1158991211/606
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 395 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.018s