C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: メモリリークについて


(過去ログ 140 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■82062 / inTopicNo.1)  メモリリークについて
  
□投稿者/ JYK (4回)-(2016/12/04(Sun) 17:44:32)

分類:[.NET 全般] 

2016/12/04(Sun) 18:27:23 編集(投稿者)

Visual Basic 2010 のAddHandler と RemoveHandlerとメモリリークについてい
質問させていただきます。

(1)現在、AddHandlerをFormのロードじにイベント登録していまいます。
そしてFormのアンロード時にRemoveHandlerのイベントの解除をしています。

AddHandler に関しては、必要な時に登録して不必要になったらRemoveHandlerでイベント削除をした方がメモリリークが起こりにくいのでしょうか?
そんなことが書いているサイトもあるので皆様方は、どのようにお考えでしょうか?

(2)AddHandlerを何度も通るとメモリリークになりますか?

(3) Visual Basic 2010とVisual Basic 6のメモリ解放について違いは、どのように違うのでしょうか?
  そのあたりのことがわかればと思います。
  

引用返信 編集キー/
■82063 / inTopicNo.2)  Re[1]: メモリリークについて
□投稿者/ shu (944回)-(2016/12/05(Mon) 09:03:30)
No82062 (JYK さん) に返信
> 2016/12/04(Sun) 18:27:23 編集(投稿者)
>
> Visual Basic 2010 のAddHandler と RemoveHandlerとメモリリークについてい
> 質問させていただきます。
>
> (1)現在、AddHandlerをFormのロードじにイベント登録していまいます。
> そしてFormのアンロード時にRemoveHandlerのイベントの解除をしています。
>
> AddHandler に関しては、必要な時に登録して不必要になったらRemoveHandlerでイベント削除をした方がメモリリークが起こりにくいのでしょうか?
> そんなことが書いているサイトもあるので皆様方は、どのようにお考えでしょうか?
今時のメモリが十分ある状況であれば気にするほどではないかと思います。
どのようにFormの表示を行うかによりますがHide,Showの繰り返しが発生する場合、Loadイベントはそのたび
発生するので気を付けた方がよいです。


> (2)AddHandlerを何度も通るとメモリリークになりますか?
メモリリークというよりイベント処理が多重に発生するので思はぬ動作をするかもしれません。
Removeしていれば大丈夫ですが。


>
> (3) Visual Basic 2010とVisual Basic 6のメモリ解放について違いは、どのように違うのでしょうか?
>   そのあたりのことがわかればと思います。
GC(あるいみ自動解放)によるか、手動解放かの違いではないでしょうか。

引用返信 編集キー/
■82065 / inTopicNo.3)  Re[1]: メモリリークについて
□投稿者/ WebSurfer (1090回)-(2016/12/05(Mon) 10:33:40)
No82062 (JYK さん) に返信

> AddHandler に関しては、必要な時に登録して不必要になったらRemoveHandlerで
> イベント削除をした方がメモリリークが起こりにくいのでしょうか?

静的イベントについてはその通りのようです。

例えば、Application クラスの全イベントが静的イベントです。MSDN ライブラリには、

"これは静的イベントなので、アプリケーションが破棄されるときにイベント ハンドラ
をデタッチしないと、メモリ リークが発生します"

・・・という解説があります。

引用返信 編集キー/
■82067 / inTopicNo.4)  Re[2]: メモリリークについて
□投稿者/ Jitta (234回)-(2016/12/05(Mon) 13:45:13)
ShowとHideの繰り返しでは、Loadは発生しないと思いますが、違ったっけ?
メモリリークをどういう状態ととるか。
静的だろうが動的だろうが、参照が残っていたら解放されない。
どういう時に解放されていないかをリークしているとするかで、リークしているしていないは変わります。
動的イベントであっても、その動的イベントを定義するインスタンスが解放されない限り解放されない。
アンロードイベントって何?FormClosed?
引用返信 編集キー/
■82068 / inTopicNo.5)  Re[3]: メモリリークについて
□投稿者/ shu (945回)-(2016/12/05(Mon) 13:53:09)
No82067 (Jitta さん) に返信
> ShowとHideの繰り返しでは、Loadは発生しないと思いますが、違ったっけ?
失礼しました。
ShowDialogしてDisposeせずに再度ShowDialogでした。
引用返信 編集キー/
■82070 / inTopicNo.6)  Re[4]: メモリリークについて
□投稿者/ JYK (5回)-(2016/12/05(Mon) 23:37:40)
No82068 (shu さん) に返信
> ■No82067 (Jitta さん) に返信
>>ShowとHideの繰り返しでは、Loadは発生しないと思いますが、違ったっけ?
> 失礼しました。
> ShowDialogしてDisposeせずに再度ShowDialogでした。

色々、ありがとうございます。ご参考になります。


AddHandlerの前にRemoveHandlerを実行させるのは、イベントの数を1回にするこで可能でしょうか?

引用返信 編集キー/
■82219 / inTopicNo.7)  Re[5]: メモリリークについて
□投稿者/ JYK (6回)-(2016/12/18(Sun) 10:04:39)
No82070 (JYK さん) に返信
> ■No82068 (shu さん) に返信
>>■No82067 (Jitta さん) に返信
> >>ShowとHideの繰り返しでは、Loadは発生しないと思いますが、違ったっけ?
>>失礼しました。
>>ShowDialogしてDisposeせずに再度ShowDialogでした。
>
> 色々、ありがとうございます。ご参考になります。
>
>
> AddHandlerの前にRemoveHandlerを実行させるのは、イベントの数を1回にするこで可能でしょうか?
>

あと一つ聞きたいことがります。
http://tasano2525.blogspot.jp/2014/07/c.html
上記のアドレスに購読していないイベントは、メモリリークになりますと書いていますが
Private Sub OnDataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs)
にいくつかRaiseEventがあります。

これを発生させるには、AddHandlerが実行されていないとRaiseEventが動作しないのですが
RaiseEventが発生しない(動作しない)場合、メモリリークになる可能性もございますか?




引用返信 編集キー/
■82220 / inTopicNo.8)  Re[6]: メモリリークについて
□投稿者/ Azulean (748回)-(2016/12/18(Sun) 10:46:48)
2016/12/18(Sun) 10:51:03 編集(投稿者)

.NET のメモリ管理、ガベージコレクション(GC)、オブジェクトの生存期間といった要素を一通り学んでもらった方がいいと思います。
法則性を理解していないと、個別ケースごとに質問しないと先に進まなくなるので。

・静的なイベントに AddHandler した後、RemoveHandler せずに放置すると、そのイベントハンドラを割り当てたオブジェクトの参照が残るので、オブジェクトが不要になっていたとしても回収されることがない。
 →イベントを発行する側の生存期間が長く、イベントを受け取る側の生存期間が短い場合は RemoveHandler が必要。
・同じ生存期間のコンポーネント、コントロール相手に AddHandler したものは、RemoveHandler せずともかまわない。(Form の InitializeComponent がその一例)

個別ケースについて答えていっても終わりが見えないので、法則性、リークすると言われているバックグラウンドを理解するように努力しましょう。

-----
メモリリークを気にするのに、.NET のメモリ管理・GC を勉強しないのは足りていないと考えています。
メモリリークの要因はイベントハンドラだけではないからです。
「.NET メモリ管理」をキーワードにいろいろと調べてみてください。
引用返信 編集キー/
■82221 / inTopicNo.9)  Re[6]: メモリリークについて
□投稿者/ WebSurfer (1099回)-(2016/12/18(Sun) 10:51:33)
No82219 (JYK さん) に返信

> http://tasano2525.blogspot.jp/2014/07/c.html
> 上記のアドレスに購読していないイベントは、メモリリークになりますと書いていますが

それは以下の記事の「登録解除が必要」のセクションに書いてあることと同じこと
を言っているのではないかと思います。

【雑記】イベントの購読とその解除
http://ufcpp.net/study/csharp/MiscEventSubscribe.html

抜粋すると:

"・・・前略・・・

発生側から受取側にイベントを伝える都合上、必ず、発生側が受取側の参照を持ち
ます。 発生側の寿命が長くて、受取側の寿命が短い場合、イベント購読解除しない
とメモリ リークが起きます。

・・・中略・・・

寿命に差があるときにだけ管理すればいい

・・・後略・・・"
引用返信 編集キー/
■82236 / inTopicNo.10)  Re[6]: メモリリークについて
□投稿者/ Jitta (240回)-(2016/12/20(Tue) 21:46:25)
No82219 (JYK さん) に返信
> これを発生させるには、AddHandlerが実行されていないとRaiseEventが動作しないのですが
> RaiseEventが発生しない(動作しない)場合、メモリリークになる可能性もございますか?

 何をもって「リークしている」としますか。
例えば、System.Windows.Forms.Application.ApplicationExit に、コンストラクタ…おっと、VB.NET では Load イベントの方が一般的?で、何かのクラスのインスタンス メソッドを結びつけます。このインスタンスは、コンストラクタなり Load イベントハンドラの中でインスタンス化したとします。変数の参照可能範囲は、コンストラクタ/イベントハンドラの中のみとします。コンストラクタや Load イベントを抜けたとき、メモリリークは発生しているでしょうか。

 答え。開発者の意図による。

 開発者が、「コンストラクタ(Load イベントハンドラ)を実行中にアプリケーションが終了した場合のみ、行いたい処理」としてイベントハンドラを登録したなら、メモリリークです。
しかし、「アプリケーションが終了した場合に行いたい処理」として登録したらなら、メモリリークではありません。
とはいえ、後からメンテナンス目的で見た場合、どちらか判別がつきにくいので、一般的には避けるべき書き方です。


 .NET Framework では、開発者は積極的にメモリ管理をする必要はありません。質問の意図は、なんでしょうか。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -