1 名前:デフォルトの名無しさん [2006/09/23(土) 15:00:11 ] 語って.はぁと part boost::mpl::int_<3> 前スレ part 2 pc8.2ch.net/test/read.cgi/tech/1139313234/ part 1 pc8.2ch.net/test/read.cgi/tech/1091198276/ ■関連サイト■ Boost C++ Libraries www.boost.org/ Boost 翻訳プロジェクト boost.cppll.jp/HEAD/ Let's Boost www.kmonos.net/alang/boost/ boost info shinh.skr.jp/boost/
492 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 16:05:56 ] boost開発者向けMLに、自分用に作った プログラム(boostの既存libの部品の追加してるだけだけど)、 死蔵するのもったいないから ときどき投稿してたんだけど、 最近、無視されてるっぽい。
493 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 17:41:27 ] boost使いはVS2005にSP1はあてるのかい?
494 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 17:56:40 ] 当たり前だ
495 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 21:36:36 ] >>492 何か不満か? ML に晒したんなら勝手に使ってる奴もいるだろう。 使った人が必ずレスポンスを返すわけでもなし。 死蔵にはならずに済んだんだからいいだろ。
496 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 22:52:25 ] boost.cppll.jp 落ちてる?
497 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 23:29:55 ] ぽいね。俺も繋げない
498 名前:デフォルトの名無しさん mailto:sage [2006/12/22(金) 11:42:53 ] ublasのatlasへのインターフェイスをbackendと表現してるのだが backendってそういう意味なんだっけ?
499 名前:デフォルトの名無しさん mailto:sage [2006/12/22(金) 12:01:23 ] まあCORBAとDCOMではproxy/stubが逆転していることですし
500 名前:デフォルトの名無しさん mailto:sage [2006/12/22(金) 15:15:00 ] >>499 それは主体をどっちに置くかという話から帰着した結果だからあんまり関係ない気が。
501 名前:デフォルトの名無しさん mailto:sage [2006/12/22(金) 23:08:58 ] atlasは下請けや補完をやるわけだから、 ublasから見ればたくさんあるbackendの一つってことでしょ。
502 名前:デフォルトの名無しさん [2006/12/24(日) 12:39:36 ] boostの日本語ドキュメントプロジェクトって2003年で更新止まってるよね サーバーも落ちてるみたいだけど、誰もメンテナンスしてないの?
503 名前:デフォルトの名無しさん mailto:sage [2006/12/24(日) 17:51:43 ] ublas今試してるんだけど、 VC++2005でboost1.33_1だとsparse_matrixとsparse_vectorは定義されていないと怒られてしまう。 matrix_sparse.hppとvector_sparse.hppはきちんとインクルードしているんだけど、なぜに?
504 名前:デフォルトの名無しさん mailto:sage [2006/12/24(日) 18:41:52 ] しかも、mat[i][j]とかで行列の要素にアクセスするとか、lu_factorizeもコンパイルエラー。なんでやろ・・・。
505 名前:デフォルトの名無しさん mailto:sage [2006/12/24(日) 18:49:16 ] エラーメッセージも張らずに日記かよ。いい加減にしろ
506 名前:デフォルトの名無しさん mailto:sage [2006/12/25(月) 13:27:53 ] >>504 mat[i][j]の書き方はできなくなった 今は mat(i,j)
507 名前:デフォルトの名無しさん mailto:sage [2006/12/25(月) 13:47:21 ] Boost.Python でPythonから呼ぶようにした関数って Cとして呼ぶよりも処理が遅くなったりするの?
508 名前:デフォルトの名無しさん mailto:sage [2006/12/26(火) 16:16:15 ] すみませんが、質問です。 Debian Sarge(EUC-JP)上でBoostのsplitなどをを使いたいのですが、ソースコー ドの文字列をEUC-JPにするとエラーになってしまいます。 #include <boost/algorithm/string.hpp> を含むソースで g++-3.4 -finput-charset=EUC-JP -fexec-charset=EUC-JP test05.cpp -o test05 を実行すると、 /usr/include/boost/function/function_base.hpp:23:25: failure to convert EUC-JP to UTF-8 このようなエラーに。 なお、ソースではwchar_t, wstringを使っています。 ソースをUTF-8に、オプションを-finput-charset=UTF-8 にすると動くように なりますが、やはりこれは不便です。 ソースをEUC-JPのままで使う方法はないでしょうか?
509 名前:デフォルトの名無しさん [2006/12/26(火) 18:55:42 ] age
510 名前:508 mailto:sage [2006/12/26(火) 19:42:26 ] 追記です。 コンパイル時のエラーは、こんな単純なソースでも起こってしまいます。 エラー再現には、ソースにワイド文字リテラルが含まれる必要はありません。 ------------------ #include <boost/algorithm/string.hpp> int main(void) { return 0; } ------------------ g++-3.4 -finput-charset=EUC-JP -fexec-charset=EUC-JP test06.cpp -o test06 ↓ /usr/include/boost/function/function_base.hpp:23:25: failure to convert EUC-JP \to UTF-8 EUC-JPではマルチバイト文字を使えということなのかもしれませんが、せっかく 対応しているのだからワイド文字を使いたいのです。
511 名前:デフォルトの名無しさん mailto:sage [2006/12/26(火) 19:56:55 ] >>510 boost/ref.hppがLatin-1で書かれているのが問題っぽいな。 ASCIIに直すようにお願いする位しか解決策が思いつかないが。
512 名前:508 mailto:sage [2006/12/26(火) 20:20:55 ] >>511 ありがとうございます。 ref.hppの17行目でしょうか?そこを削除しても、やはり同じエラーが出ます。 他に気づいたことは、-finput-charset=utf8 などと書いても、「UTF-8に変換 できない」というエラーになることです。大文字ハイフン入りの「UTF-8」以外 受け付けません。 もしかしたらGCC自体が、テンプレートライブラリがUTF-8以外であることに対応 していないのでしょうか?
513 名前:デフォルトの名無しさん mailto:sage [2006/12/26(火) 20:38:10 ] >>508 この辺を参考に search.gmane.org/?query=windows+unicode+gcc&group=gmane.comp.gcc.devel permalink.gmane.org/gmane.comp.gcc.devel/78542 >>512 インクルードファイルの中に他にも含まれていないか チェック。utility/enable_if.hpp とか $ iconv -l で使用できる文字コードは分かる
514 名前:508 mailto:sage [2006/12/26(火) 21:08:11 ] >>513 ありがとうございます。よく読んでいませんが、結局コードの変換ルールが問 題ということでしょうか。 grep -r Jaakko /usr/include/boost/ これで検索したところ66件ありました。他にもlatin-1の名前はあるかもしれ ません。さすがに直す気が失せました。 とりあえず、コンパイル前にiconvをかけることにします。いずれはUTF-8環境 に移行した方が良さそうです。
515 名前:508 mailto:sage [2006/12/27(水) 00:25:09 ] permalink.gmane.org/gmane.comp.gcc.devel/78542 を読んで思ったのですが、どうやらUTF-8にすれば完全解決というわけではな いようですね。 g++ -finput-charset=EUC-JP こう書くと、GCCはソースファイルを、includeされるヘッダライブラリまです べてEUC-JPだとみなします。そしてそれを libiconv で UTF-8 に変換しよう とします。このとき(ヘッダファイルに)EUC-JPに含まれない文字コード (Latin-1など)があったらエラーになってしまいます。 g++ -finput-charset=UTF-8 (または-finput_charsetの指定なし) こう書くと、GCCはソースファイルを、includeされるヘッダライブラリまです べてUTF-8だとみなします。しかし今度は変換の必要がないので、libiconv は 呼ばれません。ヘッダライブラリも変換されません。 これで通常は問題はなくなるわけです。しかし、 ・ヘッダライブラリのエンコーディングがUTF-8でない。 ・ヘッダライブラリに wcha_tのリテラルがある。 (あまりないでしょうが、)この2つが同時に起こると、ライブラリは正しく 動作しません。 結局、すべてのヘッダファイルがUTF-8で統一されるか、Pythonのように各ソー スファイルにエンコーディングの宣言ができるようにしないと、完全解決とは 言えないようです。いずれも一ユーザにはどうしようもない話ですが。 Boostとあんまり関係なくてすみません。
516 名前:デフォルトの名無しさん [2006/12/27(水) 13:04:16 ] 初心者的質問で申し訳ありません。 >>391 でインストールするとき、最初に default variantsを選んでください って言われて、 Multithred Debug, DLL Multithred, DLL Multithred Multithred, static runtime Multithred, Debug, static runtime Single thred, static runtime Single thred, Debug, static runtime の中から選択させられるんですが、ノーパソ用ペンティアム3(1.13GHz)とノースウッドコアペンティアム4(3.2Ghz) の場合、どれを選べばいいんでしょうか。 マルチスレッデッィングとシングルスレッディング用CPUの違いくらいしか分からないので・・・
517 名前:デフォルトの名無しさん mailto:sage [2006/12/27(水) 14:35:53 ] Multithred/Single thredはCPUの問題じゃない
518 名前:デフォルトの名無しさん mailto:sage [2006/12/27(水) 14:36:53 ] boostにはデバッグは特にいらないと思う。かなりでかくなるから。 DLLにするかどうかだけど、初心者ならスタティックでいいと思う。 あとはスレッドを利用するならマルチスレッド、しないならシングルスレッド。 シングルスレッドで速度を追求するならシングルスレッドだけど 通常はマルチスレッドでいいと思う。
519 名前:デフォルトの名無しさん mailto:sage [2006/12/27(水) 14:37:16 ] thred?
520 名前:518 mailto:sage [2006/12/27(水) 14:37:42 ] 訂正 ×特に ○別に
521 名前:516 [2006/12/27(水) 14:45:12 ] ありがとうございます。 ではとりあえず Multithred, static runtime でインストールして使ってみます。 なお、参考までにお聞きしたいのですが、DLLにするとどういった使い方が可能になるのですか?
522 名前:デフォルトの名無しさん mailto:sage [2006/12/27(水) 14:49:20 ] templateなlibraryにDLLもくそもないから気にするな。
523 名前:デフォルトの名無しさん mailto:sage [2006/12/27(水) 15:11:02 ] >>521 DLLの特長はここに書いてある。 e-words.jp/w/DLL.html 必要ならDLLを選ぶといいと思う。
524 名前:デフォルトの名無しさん [2006/12/27(水) 16:19:19 ] vc2005 sp1の現状 std;;wstring s = L"漢字"; // std::wcout << s << std::endl; //←ここをコメントアウトすると何もでなくなる std::wcout.imbue(std::locale("japanese") std::wcout << s << std::endl; //←出る std::locale::global(std::locale("C")); std::wcout << s << std::endl; //←出る よくわかんないけどMSの開発担当者はもっとまともなロケール実装者が来るまで正座な。
525 名前:デフォルトの名無しさん mailto:sage [2006/12/27(水) 16:22:23 ] boostとは直接関係ないけど、これ直ってないのか。なんのためのSPなんだか('A`)
526 名前:デフォルトの名無しさん mailto:sage [2006/12/27(水) 20:10:24 ] >>524 とりあえずSTLport使っとくとlocale::globalの後に それぞれimbueすればちゃんと動くらしいよ。 付属のだとそれすら効かない。 std::locale loc("japanese"); std::locale::global(loc); std::wcout.imbue(loc); std::wcout << L"ぶーすと" << std::endl;
527 名前:デフォルトの名無しさん mailto:sage [2006/12/27(水) 23:15:10 ] ublasでrankは求められなかとですかい? rank求めるのにlu分解は精度の問題で、一般には使われてないとか書いてるけど、 どの程度精度に問題でてくるんだろうね。
528 名前:デフォルトの名無しさん mailto:sage [2006/12/28(木) 12:41:32 ] ttp://www.page.sannet.ne.jp/d_takahashi/boost/ublas/index.htmlを参考にして ublasで逆行列を求めようとしているのですが、lu_factorizeの呼び出しでコンパイルエラーになります。 エラーメッセージが大量なので、ソースと一緒にアップローダに上げておきます。 ttp://zetubou.mine.nu/itoshiki/nozomu/zetubou3677.zip
529 名前:デフォルトの名無しさん mailto:sage [2006/12/28(木) 13:06:13 ] 実行時エラーなら出るがコンパイルエラーは出ないな。 VC8SP1 + Boostは11月の頭にCVSから F:\>cl -nologo -EHsc -ID:\Boost inv.cpp inv.cpp F:\>inv.exe Check failed in file D:\Boost\boost/numeric/ublas/triangular.hpp at line 2435: e1 () (n, n) != value_type () This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information. F:\>
530 名前:デフォルトの名無しさん mailto:sage [2006/12/28(木) 15:50:10 ] November 28, 2006 - Function Types Accepted
531 名前:デフォルトの名無しさん mailto:sage [2006/12/29(金) 19:50:03 ] VC7 でserializationのlib出きへんのやけど なんか必要?
532 名前:528 mailto:sage [2006/12/29(金) 20:29:50 ] boostを1.32.0に入れ替えてみたところコンパイル出来ました。 実行時エラーは、おそらく係数行列を適当に設定したため発生したのだと思います。 係数行列を参考サイトと同じ行列にしたところ、同様の結果が得られました。 ublas使う時だけ1.32.0で行くことにします。ありがとうございました。
533 名前:デフォルトの名無しさん mailto:sage [2007/01/03(水) 10:46:57 ] >>3 にリンクされてるPOCOって使ってる人いる? 今日落として試してみたんだけど、SampleについてるEchoServerの挙動が 微妙におかしくて…… 原因は一応分かったのだが、英語力が無いからまっとうなバグレポ 送れにゃいよ。
534 名前:デフォルトの名無しさん mailto:sage [2007/01/03(水) 14:13:46 ] >>533 英語力ないからって言ってると永遠に身につかないよ。 バグレポなら状況を箇条書きにして送るだけでも大丈夫、ただし返信が来たらしらない(w
535 名前:デフォルトの名無しさん mailto:sage [2007/01/03(水) 14:59:14 ] >>534 そうだよなあ。 とりあえず、がんがって次のようなバグレポを書き込んだ。 意味が通るかどうかは全く自信が無いw Hello. I'm a Japanse, so please forgive my poor English. When I tested "EchoServer" sample, I found that it doesn't send back FIN to the client when the client sends FIN to the "EchoServer", by calling shutdown(). This is because "EchoServer" doesn't call close() function for this socket. Why is that? Poco::Net::StreamSocketImpl is refcounted, and close() is called when it is really destructed. I found that Poco::Net::SocketReactor's member, _pReadableNotification, _pWritableNotification, etc. holds Poco::Net::Socket instance, until next socket event arises. So, until then, refcount remains 1, and close() is never called. In Poco::Net::SocketReactor::run(), member function dispatch() is called for each socket. I think, after that, the socket which is held by _pReadableNotification, etc. must be immediately cleared, so Poco::Net::StreamSocketImpl's refcount will be 0, and close() will be called.
536 名前:デフォルトの名無しさん [2007/01/04(木) 13:26:47 ] boost の program_options で言及されているレスポンスファイル に関する機能って、以前は configuration file って呼ばれていた ものですか?単に呼び方が変わっただけですか? www.boost.org/doc/html/program_options/howto.html#id2715898
537 名前:536 [2007/01/04(木) 13:32:57 ] 1.33.1 のソースを見てみると、 // Additional command line parser which interprets '@something' as a // option "config-file" with the value "something" なんて書いてあるなぁ、前からあった機能なのか。 なんか俺が勘違いしていたみたいです。
538 名前:536 [2007/01/04(木) 13:42:23 ] 追加のオプションをファイルで与えることが出来る multiple source の機能と、コマンドラインそのものを ファイルの形で与える response file の機能を 混同していたようです。
539 名前:デフォルトの名無しさん mailto:sage [2007/01/04(木) 14:35:43 ] ある大学でresearch programerっていう仕事の公募が出てる research programerていうのはboostの開発してるような人達なのかな
540 名前:536 [2007/01/04(木) 14:42:44 ] >>539 頼まれてシミュレータなどのコードを書く人のことじゃないかなぁ。
541 名前:デフォルトの名無しさん mailto:sage [2007/01/04(木) 16:05:49 ] >programer programmer
542 名前:デフォルトの名無しさん mailto:sage [2007/01/04(木) 17:55:53 ] >programmer programer
543 名前:デフォルトの名無しさん mailto:sage [2007/01/04(木) 19:01:27 ] pugeramer
544 名前:535 mailto:sage [2007/01/05(金) 04:25:51 ] POCOにバグレポ書いたと思ったら、もうFixされたバージョンリリースされてた。 はえー。 拙い英文でもバグレポ書いた甲斐があったわ。 勇気付けてくれた >>534 あんがと。
545 名前:デフォルトの名無しさん mailto:sage [2007/01/05(金) 11:12:28 ] 英語力がないから>535の意味を掴み切れない_/ ̄|○ #今年は真面目に(系統立てて)勉強するかな……
546 名前:535 mailto:sage [2007/01/05(金) 12:11:30 ] >>545 俺のアホな英文が分からないのは、多分君のせいじゃない。 相手はプログラムを良く理解してるから、クラスやメソッド名などのキーワードを 見て、問題を理解してくれたんだと思う。 今日も POCO を眺めてみたが、std::string ベースなので Path クラスが 日本語名を上手く扱えないという実にありがちな問題が……。 一見すると POCO_WIN32_UTF8 を定義して utf-8 ベースでやってれば 上手く機能しそうにも見えたが、たまにそのまんま std::fstream とかに 渡してるから、やっぱダメだな。 つうかいつになったらWindowsはja_JP.UTF8風なコードページをサポートして くれるんだ。OS内部だけUTF-16化されてたってしょうがないだろうに。
547 名前:デフォルトの名無しさん mailto:sage [2007/01/05(金) 12:41:48 ] >>546 無理 ttp://blogs.msdn.com/michkap/archive/2007/01/03/1392379.aspx まあ、ここでも言われているけど、 98がラッパでUnicodeをサポートできるように、 UTF-8のラッパをかぶせられないこともない。 どれほどの需要があるのか分からないけど。
548 名前:デフォルトの名無しさん [2007/01/06(土) 09:17:55 ] shared_ptrやweak_ptrのソースを調べてるんだけど、 shared_ptrは内部でweak_ptrを使ってるようだけど、これは何のため なんだろうか。weak_ptrはshared_ptrの循環参照の欠点を克服できる という話を聞いてるんだけど、shared_ptrのなかにすでにweak_ptrが使われてる ということは、もうshared_ptrは循環参照を克服したってことでいいんですか? 違うとしたら、weak_ptrをどう使ってshared_ptrの循環参照を克服できるのか 教えてください。weak_ptrのソースみてみると、なんだかweak_countという 別のカウンタを使っているだけで中身はほとんどshared_ptrと同じように参照カウンタ方式 にみえるんだけど、これで本当に循環参照、解決するんだろうか…?
549 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 10:05:47 ] ttp://www.kmonos.net/alang/boost/ ここのスマートポインタってところ読んでから来いや。
550 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 10:12:40 ] >もうshared_ptrは循環参照を克服したってことでいいんですか? よくない。 weak_countは参照カウンタの参照カウンタとでも言えばいいんだろうか。 struct A { shared_ptr<A> a; } shared_ptr<A> hoge(new A); hoge.a = hoge; struct A { weak_ptr<A> a; } shared_ptr<A> hoge(new A); hoge.a = hoge; この二つでどのように参照カウンタが変化するのか、調べてみるといいよ。
551 名前:デフォルトの名無しさん [2007/01/06(土) 11:16:45 ] >550 shared_ptrはカウンタ増えるけど、 weak_ptrはカウンタ増えないね。weak_ptrのカウンタはなぜ増えない?? 代入で増えるように定義されてるように見えたんだけど >549 いちおう読みました
552 名前:デフォルトの名無しさん [2007/01/06(土) 13:50:29 ] 循環参照が置きるshared_ptrの相互参照がある場合、 相互参照の片方をweak_ptrに置き換えて循環参照が解決できる、 という理解でよろしいんでしょうか、ご教授ください
553 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 13:51:53 ] そんな事、人に訊かんとわかんないもんかね。
554 名前:デフォルトの名無しさん [2007/01/06(土) 14:34:16 ] >553 これって実は誰でも知ってること??
555 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 14:36:23 ] >相互参照の片方をweak_ptrに置き換えて循環参照が解決できる この説明だと片方を単にポインタに置き換えるだけで良いじゃないか,という反論が 想定され, weak_ptr の本質的な利点と特徴を説明できていないような?
556 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 15:22:57 ] >>554 皆知ってるかは知らんが、自分で結論出せないのなら 完全に理解できてないってことだ。
557 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 15:45:06 ] そりゃ完全に理解できてないから訊いてるんだろ。
558 名前:デフォルトの名無しさん [2007/01/06(土) 15:48:06 ] >555 単にポインタに置き換えるだけだと、自動で消えないからマズいんですよね?? weak_ptrなら、相互参照の片方が消えたら自分も消えるんでウマいこと いくってことでOK? >556 結論を出してみたけど間違ってたまま覚えてたらまずいんで 合ってるのかどうかだけでも教えてください
559 名前:デフォルトの名無しさん mailto:sage [2007/01/07(日) 03:14:24 ] boostのUnitTestってCppUnitと比べてどんな感じですか?
560 名前:デフォルトの名無しさん mailto:sage [2007/01/07(日) 03:26:17 ] マグロとイカフライみたいな感じかな
561 名前:デフォルトの名無しさん mailto:sage [2007/01/07(日) 03:32:22 ] >>560 ありがとうございました
562 名前:デフォルトの名無しさん mailto:sage [2007/01/07(日) 05:51:31 ] ちょww
563 名前:デフォルトの名無しさん [2007/01/07(日) 13:58:09 ] weak_ptrにいれたshared_ptrのカウントと、weak_ptrのカウントが 同じカウントになるような気がする。 つまりshared_ptrが消えるときにweak_ptrのカウントもゼロになって 同時に消える仕掛けになってると考えていいんでしょうか先生?
564 名前:デフォルトの名無しさん [2007/01/07(日) 15:19:12 ] ちがった・・・入ってるshared_ptrが消えてもweak_ptrのカウントは1残った… それまではカウント同じなのになぜ??
565 名前:デフォルトの名無しさん mailto:sage [2007/01/07(日) 20:29:47 ] >>558 >単にポインタに置き換えるだけだと、自動で消えないからマズいんですよね?? いや, weak_ptr の機能は参照先のオブジェクトの生存管理と直接は無関係です. 普通のポインタで参照していようが, weak_ptr で参照していようが, shared_ptr による参照カウントが0になればそのオブジェクトは消えます. 単なるポインタと比較した場合の weak_ptr の利点は, -参照先のオブジェクトが生存しているかどうかを調べることができて,かつ -shared_ptr に格上げできる ことです. いずれにせよ, shared_ptr による循環参照の問題の解決するにあたって, 必ず weak_ptr の機能が必要になるわけではないです. 単に weak_ptr の機能を理解しようとするだけなら, 循環参照の問題はとりあえず脇に置いておいた方が良いような気がします.
566 名前:デフォルトの名無しさん mailto: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 の実装面での動作です.
567 名前:デフォルトの名無しさん [2007/01/08(月) 03:42:00 ] >>566 うそ〜ん??shared_ptrはカウントを二種類持ってるってこと? あ、sp_countと内部のweak_ptrの二種類のことを言ってる??
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; 試してみたらどっちも増えなかったよ
569 名前:デフォルトの名無しさん mailto:sage [2007/01/08(月) 10:57:47 ] >>568 weak_ptrのuse_countはweak_countを返すわけじゃないよ。 ドキュメント読め。
570 名前:デフォルトの名無しさん mailto:sage [2007/01/08(月) 18:09:37 ] Boost.Timeseries Boost.Accumrator は結局アクセプトされたの?
571 名前:デフォルトの名無しさん mailto: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 が存在しない状態でも オブジェクトが破棄されていることが分かり、エラーを返すことが出来る。
572 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 16:13:31 ] Statistical Distributions and Mathematical Special Functions のレビューコメントが厳しいのばっかりなのはなんで? 最初 Boost.Mathとか名前ついてたときは、 ちょっと広すぎな名前だとは思ったけど
573 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 16:49:03 ] >>572 >Statistical Distributions and Mathematical Special Functions 興味あるんだけどどのへん見ればいいの? ポインティングよろしく
574 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 17:14:44 ] boost-consulting.com/vault/index.php?PHPSESSID=bq352onkg7ogdbu4lundegolg1&direction=0&order=&directory=Math%20-%20Numerics の math-toolkit-code.tar.bz2
575 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 17:25:00 ] >>574 Thanks!
576 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 18:12:22 ] >>548-571 通りすがりだけど、このやり取りで、weak_ptrがすっごくよく分かった! 日本語でこれだけちゃんとした説明はどこにもないと思う。ありがとう!
577 名前:デフォルトの名無しさん [2007/01/10(水) 21:17:34 ] shared_ptrなんだけど、中にいれるオブジェクトが消えると カウントが減りますよね。 でも、中のオブジェクトが消えたということを、shared_ptrはどうやって知るんですか? 代入演算子で上書きされたときについては、代入演算子の多重定義で 上書きされたほうをデクリメントしてるのは分かるんだけど、 スコープを抜けたときとかはshared_ptrには分からんのでは? リアルタイムにオブジェクトが生きてるかどうかを監視してるわけでもないのに、 スコープ抜けてオブジェクトが自然消滅したときにもちゃんとカウントが 減ってるのって不思議すぎる。これ分かる人いる?
578 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 21:25:23 ] >中にいれるオブジェクトが消える >代入演算子で上書きされたとき >オブジェクトが生きてるかどうか この辺が果てしなく意味不明。 >>577 はshared_ptrを全く理解していないようだ。
579 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 21:55:07 ] ソース読めばわかるよ
580 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 21:57:28 ] >577 デストラクタ
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のカウントを下げてるか分かりますか??
582 名前:デフォルトの名無しさん mailto: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が呼ばれる。
583 名前:デフォルトの名無しさん [2007/01/11(木) 09:19:43 ] 初歩的な質問で申し訳ないけれど、 shared_ptrはコンストラクタではいろんなオブジェクトを受け付けるけど 代入はスマートポインタしか受け付けないってのは正しい? いちど初期化してしまうと、 あとから別のオブジェクトを入れるには他のshared_ptrにいれてから 本当に入れたいshared_ptrにそのshared_ptrを代入するしかありませんか?
584 名前:デフォルトの名無しさん mailto: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を理解しようなんて百年早い。 基礎からやり直しな。
585 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 09:55:44 ] C++っていうかC
586 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 10:01:40 ] >>584 んなどうでもいいことよりも少しは本質的な話をしたらどう
587 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 10:03:37 ] do{ hogehoge(); }while(0); hogehoge()は実行されますか?
588 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 10:28:53 ] >>587 それは別のスレで質問したらいいと思う
589 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 10:45:07 ] >>583 reset すれば?
590 名前:デフォルトの名無しさん [2007/01/11(木) 10:47:47 ] お前らと仲良くなりたくて、もっと weak_ptr について理解を 深めようと思ったが、頭が悪すぎて理解できなかった。 なんかやばそうだから循環参照が起きないように気をつけよう、 その程度の理解な俺が作っているプログラムを使わされている やつカワイソス。
591 名前:デフォルトの名無しさん [2007/01/11(木) 10:49:54 ] ちなみに俺の理解では weak_ptr は参照カウントを増減させないので たとえ weak_ptr で参照されていたとしても実体が delete されて いるかもしれん。だから weak_ptr の参照先が生きてるかどうか ちゃんとチェックしてから使おうね、ってことなんだが。
592 名前:デフォルトの名無しさん [2007/01/11(木) 10:51:18 ] 生のポインタじゃなくて weak_ptr を使う理由は、 参照先のオブジェクトの生死を追跡することが出来るから。 えっと、ほかにうれしさある?