クイックメニュー
スレタイ検索

C#, C♯, C#相談室 Part93

93デフォルトの名無しさん [sage]

AAS

NG

設計次第じゃないの

2017/10/18(水)15:17:21.27(8oWZ+6kpM.net)


94デフォルトの名無しさん [sage]

AAS

NG

購読側じゃなく発行側が勝手に解除ってのがちょっと...
むしろどういう場面で必要になるのか想像できないな

> +=って内から外へ処理出しする訳だから
> インスタンスが破棄されたら当然破棄されるべきなのにどうもそうなってない
ここは何を言ってるのかよく分からない

まあ、イベントというかデリゲートのマルキチャストの仕組みが分かりづらいのはわかる

2017/10/18(水)15:34:04.84(jnsT8t6ma.net)


95デフォルトの名無しさん [sage]

AAS

NG

>>92
正しいというかとりあえず安全なのは何もしないの放り込んどく
それでも勝手に消されて困るのがあるかもしれんがw

2017/10/18(水)15:50:00.66(h6dEijxza.net)


96デフォルトの名無しさん [sage]

AAS

NG

>>94
例えば非同期通信でデシリアライズ終わったらイベント投げて後は勝手に死ね、って場合
-=だと発行側で解除するのが困難でリークしちまう
最新VerC#ならTaskで後処理書けばいいけど、Unityだとつい最近まで3.5だったから

2017/10/18(水)16:11:03.50(ufsScDVj0.net)


97デフォルトの名無しさん [sage]

AAS

NG

>>96
俺の理解不足だったらごめん

リークするのはイベントの購読側のオブジェクトLがイベントの購読を解除しないまま
Lを参照する変数がなくなった場合で、発行側のオブジェクトPのイベントに
Lのメソッドが登録されたままPへの参照がなくなってもそれはリークにならないと思うんですが

2017/10/18(水)16:24:45.96(jnsT8t6ma.net)


98デフォルトの名無しさん [sage]

AAS

NG

>>97
そう思ってた時期が俺にもありました
しかし実際はリークしてOutofMemoryが出る
どうも購読側参照が残ってると到達可能と見られてGC回収されないぽい
本当にそういう理屈かは知らんけどnullぶち込むと例外でなくなる

2017/10/18(水)16:39:10.41(ufsScDVj0.net)


99デフォルトの名無しさん [sage]

AAS

NG

思い込みって怖いネー

2017/10/18(水)17:26:02.20(jNhOnQNR0.net)


100デフォルトの名無しさん [sage]

AAS

NG

>>98
>どうも購読側参照が残ってると到達可能と見られてGC回収されないぽい

登録解除してないから購読側は発行側から参照されてて回収されない
その状態で購読側が発行側を参照してるんなら発行側も回収されないよね

2017/10/18(水)17:46:05.16(GswCLlj60.net)


101デフォルトの名無しさん [sage]

AAS

NG

循環参照しててもルートから到達不能なら回収されるよ
されないなら単に循環参照以外の参照が何かしら残ってるだけ

いいや解放されないね!とかいう思い込みに付き合う気はないから
口ごたえがしたければ、VSのメモリーアナライザーで
リークしているというオブジェクトの参照状態のスナップショットを撮って
ここに貼り付けてから続けるように

2017/10/18(水)19:19:26.31(j/PgXgnk0.net)


102デフォルトの名無しさん [sage]

AAS

NG

>>101
すまんすまん、他の言語と勘違いしてた。

2017/10/18(水)21:18:06.23(GswCLlj60.net)

名前

メール

本文