C++14/C++1yat TECH
C++14/C++1y - 暇つぶし2ch220:デフォルトの名無しさん
13/11/25 06:19:02.67
>>219
unique_ptr<T[]> a(new T[8]>;
unique_ptr<T> b(a>;
ってのが通ったらまずいが、unique_ptrには下のコンストラクタがないから大丈夫。

shared_ptr<T[]> c(new T[16]>;
shared_ptr<T> d(c);
ってのが通ったらまずいが、shared_ptr<T[]>なんてものはないから大丈夫。

221:デフォルトの名無しさん
13/11/25 09:59:08.91
shared_from_this()というのがいまいち理解できない

これどうなってんの?

222:デフォルトの名無しさん
13/11/25 21:53:44.84
やってることはトリッキーだけど単純なことなんだがシンプルで具体的な使用例がだせないな

shared_ptrで管理されてるオブジェクトがなんらかの事情で普通のポインタで渡されたときに
そのポインタから元のshared_ptrと管理権を共有するshared_ptrを得るというイディオムで使うんだけどな

223:デフォルトの名無しさん
13/11/25 22:26:31.25
URLリンク(www.ogis-ri.co.jp)
のコラム2

224:デフォルトの名無しさん
13/11/25 22:40:55.34
なるほどかなり特殊なケースみたいだな

225:デフォルトの名無しさん
13/11/25 22:42:55.82
>>222
「shared_ptrで管理されてるオブジェクトがなんらかの事情で普通のポインタで渡されたときに
そのポインタから元のshared_ptrと管理権を共有するshared_ptrを得る」というイディオム

長えよ

226:デフォルトの名無しさん
13/11/26 00:02:08.16
イディオム名はそのまま『shared from this イディオム』でそれはどういうもの?って説明が>>222だろ

227:デフォルトの名無しさん
13/11/26 21:33:57.58
boost::shared_ptrに記憶領域の番地を入れた際、
要約値を鍵にした連想配列(hash map)に
記憶領域の番地を格納。
boost::shared_from_thisを実行した際、
この連想配列からthisの持つ番地で、
boost::shared_ptrをとってくるって仕組みじゃないか?

228:デフォルトの名無しさん
13/11/26 22:00:12.84
内部にthisを指すweak_ptr持ってるだけだよ
後はshared_ptrのコンストラクタがenable_shared_thisを継承したクラスを特別扱いしている

229:デフォルトの名無しさん
13/11/26 22:40:40.37
参照カウンターの整合性はどうなるんだ?

230:デフォルトの名無しさん
13/11/27 09:48:18.32
>>229 どんなケースで問題が起こると思ってるの?

231:デフォルトの名無しさん
13/11/27 18:38:48.13
newして返したboost::shared_ptrと、
boost::shared_ptrで確保した、boost::shared_ptrを返した時。
特に片方が共同所有権としてつかわれ、
片方がEventの委譲用とかよくありがちじゃん。

232:デフォルトの名無しさん
13/11/27 18:42:03.66
それで何か問題になるのか

233:デフォルトの名無しさん
13/11/27 19:47:52.61
>>232
二重delete

234:デフォルトの名無しさん
13/11/27 21:00:11.72
長文失礼
shared_ptrのオブジェクトの管理領域は次のようになっている
管理領域の参照カウンタ、オブジェクトの参照カウンタ、オブジェクトへのポインタ、デリータへのポインタ
ここで、shared_ptrは管理領域、オブジェクト両方のカウンタを増減させる。 weak_ptrは管理領域のカウンタのみを変更する。
shared_ptrの破棄によってオブジェクトのカウンタが0になったとき、オブジェクトは解放される。
しかし、管理領域は全てのweak_ptrが破棄されるまで生存する
そして、weak_ptrからshared_ptrを構築する際には、shared_ptrの管理領域へのポインタをweak_ptrが指す管理領域へのポインタへと設定している

235:デフォルトの名無しさん
13/11/27 21:02:36.06
長すぎと言われた、連レスすまん
enable_shared_from_thisは内部にweak_ptrを持っていて、shared_ptrのコンストラクタはenable_shared_from_thisを継承したクラスに対しては特殊な動作、すなわち内部のweak_ptrに管理領域へのポインタを設定する動作をする
shared_from_this関数は内部のweak_ptrからshared_ptrを構築する関数で、前述のように同じ管理領域を指すポインタが新たに構築される
全てのスマートポインタが同じ管理領域を指しているので、二重解放は起こらない

236:デフォルトの名無しさん
13/11/28 01:04:05.46
>>231
> newして返したboost::shared_ptr
わからん。何を new ?返すってどこからどこに?
> boost::shared_ptrで確保
わからん。 shared_ptr に何かを「確保」する機能なんて無いよね?

さっぱりわからん。

237:デフォルトの名無しさん
13/11/28 10:41:28.04
>>231 >>233
こいつはたぶんshared_ptrそのものを理解してない

238:デフォルトの名無しさん
13/11/28 19:18:57.03
普通に使えば普通に使えるライブラリを
浅知恵で細工して可読性もパフォーマンスもセキュリティもぶち壊す

C++ではよくあること

239:デフォルトの名無しさん
13/11/28 22:25:36.50
そういや shared_ptr を使っているインスタンスに対してVisitorパターンだったかやってみようとしたら
途中で生ポインタに変わっちゃうんであきらめたことがあった

class Hage : public Element
{
virtual void accept(Visitor &v){ v.visit(this); } // <- このとき
};

enable_shared_from_this ってのを知っていたらうまいことできたんだろうか

240:デフォルトの名無しさん
13/11/29 01:14:30.49
うん


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch