[過去ログ]
Boostを語れゴラァ part3 (1001レス)
Boostを語れゴラァ part3 http://echo.5ch.net/test/read.cgi/tech/1158991211/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
566: デフォルトの名無しさん [sage] 2007/01/07(日) 20:46:53 >>563 shared_ptr の実装は,参照カウントによって管理されるオブジェクト (A とします) と独立して,新たにフリーストア (ヒープ) 上に 参照カウント用のオブジェクト (X とします) を生成します. X は, A の参照カウントと独立して自分自身の参照カウントも持っていて, 独立した2つの参照カウントを持っているイメージになります. shared_ptr が1つ作られるごとに A の参照カウントと X の参照カウント両方が 1つ増やされ, shared_ptr が1つ破壊されるごとに A の参照カウントと X の参照カウント両方が1つ減らされます. weak_ptr が1つ作られるごとに X の参照カウントのみが増やされ, weak_ptr が1つ破壊されるごとに X の参照カウントのみが減らされます. A の参照カウントが0になれば A を delete します. しかし, X の参照カウントが0になっていなければ X は破壊されません. 最終的に全ての shared_ptr と weak_ptr が存在しなくなった時点で, X の参照カウントは0になります.この時点で X は delete されます (自殺します). 以上が, shared_ptr と weak_ptr の実装面での動作です. http://echo.5ch.net/test/read.cgi/tech/1158991211/566
567: デフォルトの名無しさん [] 2007/01/08(月) 03:42:00 >>566 うそ〜ん??shared_ptrはカウントを二種類持ってるってこと? あ、sp_countと内部のweak_ptrの二種類のことを言ってる?? http://echo.5ch.net/test/read.cgi/tech/1158991211/567
568: デフォルトの名無しさん [] 2007/01/08(月) 04:04:00 >weak_ptr が1つ作られるごとに X の参照カウントのみが増やされ, >weak_ptr が1つ破壊されるごとに X の参照カウントのみが減らされます. shared_ptr<A> hoge(new A); cout << hoge.use_count() << endl; weak_ptr<A> hogehoge(hoge); cout << hoge.use_count() << endl; cout << hogehoge.use_count() << endl; 試してみたらどっちも増えなかったよ http://echo.5ch.net/test/read.cgi/tech/1158991211/568
569: デフォルトの名無しさん [sage] 2007/01/08(月) 10:57:47 >>568 weak_ptrのuse_countはweak_countを返すわけじゃないよ。 ドキュメント読め。 http://echo.5ch.net/test/read.cgi/tech/1158991211/569
570: デフォルトの名無しさん [sage] 2007/01/08(月) 18:09:37 Boost.Timeseries Boost.Accumrator は結局アクセプトされたの? http://echo.5ch.net/test/read.cgi/tech/1158991211/570
571: デフォルトの名無しさん [sage] 2007/01/09(火) 13:46:37 オブジェクトを参照している最後の shared_ptr が破棄されるとき、 weak_ptr の有無にかかわらず、そのオブジェクトは削除される。 ただし、オブジェクトを参照する weak_ptr が存在していた場合、 参照カウントを保持する sp_counted_impl_pd は削除されない。 (weak_ptr と shared_ptr すべてが破棄されないと削除されない為) weak_ptr からポインタ参照を行いたい場合、 必ずロックして shared_ptr を取得するような設計になってるけど、 上記仕組みのおかげで、たとえ shared_ptr が存在しない状態でも オブジェクトが破棄されていることが分かり、エラーを返すことが出来る。 http://echo.5ch.net/test/read.cgi/tech/1158991211/571
572: デフォルトの名無しさん [sage] 2007/01/09(火) 16:13:31 Statistical Distributions and Mathematical Special Functions のレビューコメントが厳しいのばっかりなのはなんで? 最初 Boost.Mathとか名前ついてたときは、 ちょっと広すぎな名前だとは思ったけど http://echo.5ch.net/test/read.cgi/tech/1158991211/572
573: デフォルトの名無しさん [sage] 2007/01/09(火) 16:49:03 >>572 >Statistical Distributions and Mathematical Special Functions 興味あるんだけどどのへん見ればいいの? ポインティングよろしく http://echo.5ch.net/test/read.cgi/tech/1158991211/573
574: デフォルトの名無しさん [sage] 2007/01/09(火) 17:14:44 http://boost-consulting.com/vault/index.php?PHPSESSID=bq352onkg7ogdbu4lundegolg1&direction=0&order=&directory=Math%20-%20Numerics の math-toolkit-code.tar.bz2 http://echo.5ch.net/test/read.cgi/tech/1158991211/574
575: デフォルトの名無しさん [sage] 2007/01/09(火) 17:25:00 >>574 Thanks! http://echo.5ch.net/test/read.cgi/tech/1158991211/575
576: デフォルトの名無しさん [sage] 2007/01/09(火) 18:12:22 >>548-571 通りすがりだけど、このやり取りで、weak_ptrがすっごくよく分かった! 日本語でこれだけちゃんとした説明はどこにもないと思う。ありがとう! http://echo.5ch.net/test/read.cgi/tech/1158991211/576
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
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 406 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.010s