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

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

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

No.46050 の関連記事表示

<< 0 >>
■46050  Re[12]: コントロール・フォントスタイル変更時のFont解放について
□投稿者/ なちゃ -(2010/01/24(Sun) 01:10:38)
    No46048 (たくボン さん) に返信
    >>でもこんな風にデザイナでの操作で変わってしまうような動きなので、自分で作るプログラムでもきちんと管理できていないことが多いだろう、
    >>だから、フォントを変える時に(必要な場合のみ)Disposeを呼ぶというやり方は現実的にあまり安全ではないだろう
    >>ということです。
    >
    > 安全ではない?本当に?

    思わせぶりな書き方でなくて、何を言いたいのかはっきり書いていただきたいんですけどねー

    現実には管理(把握)できていないことが多いと思われるからあまり安全ではないだろう、といっているのですが。
    現実に、きちんと把握できている人ばかりなら別に何も言いません。
    ※一般的にそうではないだろうと私は思っているということです。

    それとも別の意味で書いてますか?
    安全ではないと言っている中身の話なら、もしFontのインスタンスがコンテナのものと同一なら、まだ使用中のFontインスタンスをDisposeすることになるので、普通に考えてこれは安全とは言えないということです。
    ※例えば、アンビエントプロパティの動作が効いていて、コンテナのFontインスタンスが共有されている場合

    >>nullの代入は実質的には動作に影響はない(動作は変わりますが最終結果は変わらない)のでおいとくとして、
    > おいておくんだ。確かに最終結果は変わらないね。

    ここの記述が必要なら、そう言ってください。
    次の瞬間に別のインスタンスが設定されるだけなので、特に書かなかったですが、この時点でGC「対象」になりますね。
    ※まあひょっとするとnull設定の時点で、内部処理では結構いろんな動作をしているかもしれませんね。
    で次のGCで回収されますね。
    Disposeを呼んでいるので、Finalizeは実行されません。

    あるいは、また何か別のことが言いたかったですか?

    >>Disposeを呼べば、その時点でradioButtonAに設定されていたFontの(ネイティブな)リソースが解放されて、そのうえでSuppressFinalizeによりFinalize対象から外されます。
    > radioButtonA.Fontは外れるよね。これで次回のGCでは一応このFontがガベージ対象になるかもしれないって訳だ。

    GC対象になるのはそのあと別のインスタンスを設定して参照が外れた時点です。
    Disposeだけ(この時点)ではGC対象にはなってませんが、というかDispose呼んだかどうかはGC対象になるかどうかとは直接関係ありませんが、何か違う意味で書いてますか?

    >>※もし、FontのインスタンスがコンテナのFontと同一のものなら、後で問題が発生する危険があるでしょう。
    > どんな問題だろう?リソースが解放されてしまう危険?

    上でも書きましたが、コンテナのFontはまだ使用中ですから、それと同一のインスタンスをDisposeするのは普通危険に思います。

    >>Disposeを呼ばなければ、そのあとの別のフォントの代入によって参照が外れますので、その時点でGC「対象」になるでしょう。
    > 確かにGC対象にはなるけどDisposeを明示的に呼ぶ場合と、呼ばなかった場合はFinalizeの動作が変わってこない?

    そもそもDisposeを呼んでいればFinalizeは実行されませんが、そういうことではなくて?

    >>次のGC時にファイナライズ対象になり、そのうちファイナライざスレッドでリソースが解放され、さらにその次のGC時にメモリ回収されるでしょう。
    > さて、ここで問題。ファイナライザメソッドが呼び出されるのはどのタイミングか?
    > ファイナライザが回収すべき(Finalizeメソッド)は、どこで管理されてて、いつ登録されるのか?
    >
    >>※もし、FontのインスタンスがコンテナのFontと同一のものなら、何もしないのと実質変わりません(コンテナからの参照が生きているため、GC対象にはならない)。
    > 一応解ってるみたいだけど。

    別にどう思われようとかまいませんが、どこかで私がおかしなことを書いていてこいつ分かってないなとか思ったのでしたら、どこがおかしかったかはっきり書いてくださいな。

    これ以降はさらに「私に対しては」何を言いたいのかわかりません。
    どう反応していいのか分からないのでとりあえずは割愛します。

    > これくらい言えばわかってもらえたかな?
    >
    > わからなかったら
    > selectedFont = new Font
    > だけでいいと思う。メモリ管理はGCに任せておけばOK(そのためのGCだし)

    はっきり言いたいことを書いてください。
    ※メモリ管理って、メモリ管理じゃなくてメモリ以外のリソースの管理の意味ですか?

    私は最初から、現実的にはFontとかのインスタンスがどうなっているか完全に自分で把握できていない人の方が多いと思うので、現実的にDisposeはやめといた方が無難だということを言ってます。
    別に、俺は完全に管理している、という人しか関わらないなら好きにすればいいですし、それに対してどうこう言うつもりもありません。

    ただ、大量に生成するのであれば別ですが、そうでない場合や、単にインスタンスをキャッシュしておいて切り替えるだけで済む場合なら、わざわざ明示的にDisposeしなくてもいいレベルのことではないかとは思っています。
    ※万一管理ミスでおかしな不具合になるくらいなら、わずかなリソースの無駄の方がダメージが小さいだろうという、妥協です。
記事No.45896 のレス /過去ログ78より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -