- PR -

【C#】参照型の参照渡しはメモリリークを起こす?

投稿者投稿内容
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-08-04 00:19
引用:

回答になってないような気がするのは僕だけ?


そう言えばそうですね。ではズバッと。

前回も言いましたが、Dispose とメモリリークを同じ次元で考えないで下さい。
理由は、Jitta さんの仰っている通りです。
「メモリの解放」なんて明示的に出来ません。Dispose 呼び出しはあくまで「リソース」の解放です。

引用:

もしかしたらDataSetを代入しているところで、DataSetが2重・3重に
メモリ上に存在する可能性もあるのかな?と思い、質問させて頂きました。


C や C++ の経験があってその影響でしょうか?「インスタンス」は new した数分しか作られません。(もちろん構造体は違います)
代入でインスタンスが増えることはありません。

なちゃさんも仰っていますが、ある種のシナリオでは Dispose を完全に呼び出すことは不可能です。
またまた手前味噌ですが。
http://blogs.wankuma.com/shuujin/archive/2006/03/01/21602.aspx

今回の場合は、GetDataSet に DataSet 渡してしまっていることから、呼び出し先が DataSet の参照をどこかに保持している可能性があります。なので、Dispose の呼び出しを安易に行う事が出来ません。

引用:

この元になったソースを、元請け会社に見せたところ「GetDataSet」の
引数の解放はいつやってるんだと指摘されてしまいました。


「全ての参照が外れていたら、GC が起動した時だよ。そうでないなら永久にされない」でOKです。
_________________
囚人のジレンマな日々
ベテラン
会議室デビュー日: 2005/05/16
投稿数: 85
お住まい・勤務地: 千葉県在住
投稿日時: 2006-08-04 14:36
Jittaさん。囚人さん。ぜうすさん。
お返事有難う御座います。

> 「ここに容器を作ってくれ」って渡すんだったら、渡す側が new することないやん。
> 「ここに入れてくれ」って渡すんだったら、ref にする意味ないやん。

ご指摘はごもっともです。。
#参照型について勉強し直して、最近になってようやく理解できました・・・

> 提示されているコードだと、リークすると考えられている DataSet は“空”ですから、
> リークするものがないですよね?

確かに、言われてみればその通りですよね・・・

> なちゃさんも仰っていますが、ある種のシナリオでは Dispose を完全に呼び出す
> ことは不可能です。
> またまた手前味噌ですが。

参考にさせて頂きます。


これで何とか、元請けの方に説明が出来そうです。
大変勉強になりました。

スキルアップ/キャリアアップ(JOB@IT)