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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.82062 の関連記事表示

<< 0 >>
■82062  メモリリークについて
□投稿者/ JYK -(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のメモリ解放について違いは、どのように違うのでしょうか?
      そのあたりのことがわかればと思います。
      
親記事 /過去ログ140より / 関連記事表示
削除チェック/

■82063  Re[1]: メモリリークについて
□投稿者/ shu -(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(あるいみ自動解放)によるか、手動解放かの違いではないでしょうか。
記事No.82062 のレス /過去ログ140より / 関連記事表示
削除チェック/

■82065  Re[1]: メモリリークについて
□投稿者/ WebSurfer -(2016/12/05(Mon) 10:33:40)
    No82062 (JYK さん) に返信

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

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

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

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

    ・・・という解説があります。
記事No.82062 のレス /過去ログ140より / 関連記事表示
削除チェック/

■82067  Re[2]: メモリリークについて
□投稿者/ Jitta -(2016/12/05(Mon) 13:45:13)
    ShowとHideの繰り返しでは、Loadは発生しないと思いますが、違ったっけ?
    メモリリークをどういう状態ととるか。
    静的だろうが動的だろうが、参照が残っていたら解放されない。
    どういう時に解放されていないかをリークしているとするかで、リークしているしていないは変わります。
    動的イベントであっても、その動的イベントを定義するインスタンスが解放されない限り解放されない。
    アンロードイベントって何?FormClosed?
記事No.82062 のレス /過去ログ140より / 関連記事表示
削除チェック/

■82068  Re[3]: メモリリークについて
□投稿者/ shu -(2016/12/05(Mon) 13:53:09)
    No82067 (Jitta さん) に返信
    > ShowとHideの繰り返しでは、Loadは発生しないと思いますが、違ったっけ?
    失礼しました。
    ShowDialogしてDisposeせずに再度ShowDialogでした。
記事No.82062 のレス /過去ログ140より / 関連記事表示
削除チェック/

■82070  Re[4]: メモリリークについて
□投稿者/ JYK -(2016/12/05(Mon) 23:37:40)
    No82068 (shu さん) に返信
    > ■No82067 (Jitta さん) に返信
    >>ShowとHideの繰り返しでは、Loadは発生しないと思いますが、違ったっけ?
    > 失礼しました。
    > ShowDialogしてDisposeせずに再度ShowDialogでした。

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


    AddHandlerの前にRemoveHandlerを実行させるのは、イベントの数を1回にするこで可能でしょうか?
記事No.82062 のレス /過去ログ140より / 関連記事表示
削除チェック/

■82219  Re[5]: メモリリークについて
□投稿者/ JYK -(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が発生しない(動作しない)場合、メモリリークになる可能性もございますか?



記事No.82062 のレス /過去ログ140より / 関連記事表示
削除チェック/

■82220  Re[6]: メモリリークについて
□投稿者/ Azulean -(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 メモリ管理」をキーワードにいろいろと調べてみてください。
記事No.82062 のレス /過去ログ140より / 関連記事表示
削除チェック/

■82221  Re[6]: メモリリークについて
□投稿者/ WebSurfer -(2016/12/18(Sun) 10:51:33)
    No82219 (JYK さん) に返信

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

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

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

    抜粋すると:

    "・・・前略・・・

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

    ・・・中略・・・

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

    ・・・後略・・・"
記事No.82062 のレス /過去ログ140より / 関連記事表示
削除チェック/

■82236  Re[6]: メモリリークについて
□投稿者/ Jitta -(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 では、開発者は積極的にメモリ管理をする必要はありません。質問の意図は、なんでしょうか。
記事No.82062 のレス /過去ログ140より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -