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

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
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
削除子は勉強になったなぁ
603
(1): 2007/01/11(木)20:18 AAS
今回の人の場合、ソース読むよりスマートポインタのことが書かれた
適当な本読んだほうがよくねえか?
いやおまいらが親切なのはよくわかったけどさ
604: 2007/01/11(木)20:31 AAS
カウンタを共有するのがポイント
605: 2007/01/11(木)20:56 AAS
>>603
>適当な本読んだほうがよくねえか?
そういう本ある?自分は見たことないんだけれど
606
(1): 2007/01/11(木)21:08 AAS
超定番ながらModern C++ Designじゃないかね?
607: 2007/01/11(木)22:49 AAS
multi_array<double,3>
じゃなくて
int ndim=3;
multi_array<double> a(ndim)
みたいな多次元配列の宣言の仕方できないのでしょうか?
ndimをプログラム中で変えたいのです
608
(3): 2007/01/12(金)09:59 AAS
多次元配列の大きさを動的に決める方法なかったみたいなので

std::map< std::vector<double double> m

で代用しました。速度で問題でそうな雰囲気もするけど、しかたないかな・・・
609: 2007/01/12(金)11:07 AAS
>>608
ふつうstd::vector<<std::vector<double> >じゃない?
610: 2007/01/12(金)11:09 AAS
>>608
スレ違いになるが、一次元配列を(動的に)確保して、擬似多次元アクセス関数を作った方が善くないか?
611
(1): 2007/01/12(金)11:32 AAS
>>606
boost::shared_ptr を理解する上で Modern C++ Design はどうなんですかね?
あれはスマートポインタについては,削除子による不完全型への対応とか
クロス DLL 問題などの突っ込んだ議論は載っていなかったように思いますし,

それに boost::shared_ptr の設計思想は, MC++D の一つの柱である
「ポリシーに基づく設計」のそれとは,アンチテーゼの関係にすらあるように思いますし.
612: 2007/01/12(金)15:50 AAS
>>608
…代用できるの?
613: 2007/01/12(金)21:54 AAS
どうみてもコンパイルエラーです。本当にありがとうございました。
614: 2007/01/12(金)23:21 AAS
>>611
標準C++ライブラリ(背表紙赤い奴)には auto_ptr の詳しい説明と
簡単なカウント式スマポの実装例があったような
あとは More Effective C++ とか?
615: 2007/01/15(月)10:15 AAS
「C++再考」のハンドルクラスの実装例なんか、どうっすかね?
616: 2007/01/15(月)17:01 AAS
boost.accumulators
いじってるんだけど、数値計算メインの人が
MPL勉強するのはちょっとしんどいんじゃないかと思うんだ
617: 2007/01/16(火)00:27 AAS
boostのヘッダーをインクルードすると、
バカみたいにコンパイル時間がかかるのですが、
メモリー増設すれば少しは早くなるのでしょうか?

Pentium M 17Ghz
Mem 500M
VS2005
OS:XP

です
コンパイルオプションをいじれば少しは早くなるのでしょうか?
618: 2007/01/16(火)00:30 AAS
CPUを速くしろ、と言おうと思ったが十分速いみたいだw
619: 2007/01/16(火)00:40 AAS
プリコンパイル済みヘッダ使えば多少はマシになんじゃない
17GHzもあるとどうかわからんけどw
1-
あと 382 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.019s