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

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

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

Re[5]: データバインドにてメモリリーク


(過去ログ 138 を表示中)

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

■81332 / inTopicNo.1)  データバインドにてメモリリーク
  
□投稿者/ ベッカム (1回)-(2016/09/08(Thu) 16:12:52)

分類:[C#] 

いつもお世話になっております。

現在、C#でWindowsアプリを作成しています。
※.net4.5 VS2013で開発しております。

フォーム上のコンボボックスにデータバインドさせて、
INotifyPropertyChangedインターフェースとBindingListクラスを使用して、
MVCモデルもどきを実現させようとしておりますが、
1つ困ったことにフォームを表示させる度に、メモリリークが発生しているようです。
※データグリッドビューのフォームもあり、そちらでもリークしている模様。。。

どこをどう修正したらメモリリークが解決するのか全く検討がつきません。
どなたかご教授を願いないでしょうか?



★ソースコードの抜粋を以下に貼り付けます。

public class CDsDeliverable
{
public BindingList<CDsComboBoxInfo> ListA { get; set; }
}

public class CNotifyPropertyChanged : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(string property)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
}

public class CDsComboBoxInfo : CNotifyPropertyChanged
{
private string displayMember = null;
public string DisplayMember
{
get { return this.displayMember; }
set
{
if (this.displayMember != value)
{
this.displayMember = value;
NotifyPropertyChanged("DisplayMember");
}
}
}

private object valueMember = null;
public object ValueMember
{
get { return this.valueMember; }
set
{
if (this.valueMember != value)
{
this.valueMember = value;
NotifyPropertyChanged("ValueMember");
}
}
}
}

public partial class CForm : Form
{
public CForm()
{
InitializeComponent();
}

private void CForm_Load(object sender, EventArgs e)
{
// this.Comboはフォーム上のコンボボックス名
CDsDeliverable bind = new CDsDeliverable();
this.Combo.ValueMember = "ValueMember";
this.Combo.DisplayMember = "DisplayMember";
this.Combo.DataSource = bind.ListA;
}
}
引用返信 編集キー/
■81333 / inTopicNo.2)  Re[1]: データバインドにてメモリリーク
□投稿者/ WebSurfer (1030回)-(2016/09/08(Thu) 16:20:31)
No81332 (ベッカム さん) に返信

> どこをどう修正したらメモリリークが解決するのか全く検討がつきません。

質問者さんの言う「メモリリーク」の定義はどういうもので、何を見てどういう根拠
で「メモリリーク」と判断されたのか教えていただけませんか?
引用返信 編集キー/
■81336 / inTopicNo.3)  Re[2]: データバインドにてメモリリーク
□投稿者/ ベッカム (2回)-(2016/09/08(Thu) 17:06:52)
2016/09/08(Thu) 17:31:01 編集(投稿者)

WebSurfer様、早速の回答ありがとうございます。


> 質問者さんの言う「メモリリーク」の定義はどういうもので、何を見てどういう根拠
> で「メモリリーク」と判断されたのか教えていただけませんか?

フォームのイベントにて、コンボボックスのSelectedIndexChangedイベントを実装しておりますが、
そのイベントがフォームを表示する度に呼ばれる回数がふえていきます。
※初期表示では、SelectedIndexChangedは1回しか呼ばれないのですが、
2回目に表示すると、SelectedIndexChangedが2回呼ばれ、
3回目に表示すると、SelectedIndexChangedが3回呼ばれるといった具合です。

また、SelectedIndexChangedイベント関数内で、private変数を参照しておりますが、
private変数が1回目と2回目、3回目で値が変わっているので、リークが原因なのではと思っております。

なお、BindingListをListに代えると上記の現象は発生しません。
※その代わり双方向データバインドができていませんが。。。
引用返信 編集キー/
■81338 / inTopicNo.4)  Re[3]: データバインドにてメモリリーク
□投稿者/ PANG2 (150回)-(2016/09/08(Thu) 17:45:16)
No81336 (ベッカム さん) に返信
> フォームのイベントにて、コンボボックスのSelectedIndexChangedイベントを実装しておりますが、
> そのイベントがフォームを表示する度に呼ばれる回数がふえていきます。

SelectedIndexChanged にブレークポイントを置いて、呼出履歴を見るとか。


> また、SelectedIndexChangedイベント関数内で、private変数を参照しておりますが、
> private変数が1回目と2回目、3回目で値が変わっているので、リークが原因なのではと思っております。

private変数をプロパティ化してsetterにブレークポイントを置くとか。

引用返信 編集キー/
■81341 / inTopicNo.5)  Re[3]: データバインドにてメモリリーク
□投稿者/ WebSurfer (1031回)-(2016/09/09(Fri) 09:47:30)
No81336 (ベッカム さん) に返信

ピンポイントで原因を示せなくてすみませんが・・・

> フォームのイベントにて、コンボボックスのSelectedIndexChangedイベントを実装しておりますが、
> そのイベントがフォームを表示する度に呼ばれる回数がふえていきます。

それはメモリリーク(メモリの解放がうまく行ってない)が原因ではなくて、質問者さんの
作ったプログラムが意図的ではなくてもそうなるように実装されていて、起こるべくして起
こっている現象のような気がします。(気がするだけで確証は示せませんが)

例えば、データバインドした後プロパティを変更すると、再バインドしないと不整合が出る
ようなプロパティの場合は、明示的に再バインドするコードを書かなくても、フレームワー
クの方で自動的に(勝手に)再バインドするはずです。それに付随するイベントも発生して
そういう結果になるのでは・・・というような観点で(メモリリークではなく)調べてみて
はいかがでしょう?

引用返信 編集キー/
■81346 / inTopicNo.6)  Re[4]: データバインドにてメモリリーク
□投稿者/ ホンダ (1回)-(2016/09/09(Fri) 15:38:41)
SelectedIndexChangedイベントハンドラはどこで設定(追加)していますか?
そこの処理を複数回通ることがあれば、SelectedIndexChangedはその回数分呼び出されます。
引用返信 編集キー/
■81373 / inTopicNo.7)  Re[5]: データバインドにてメモリリーク
□投稿者/ ベッカム (3回)-(2016/09/12(Mon) 14:59:17)
PANG2様
WebSurfer様
ホンダ様

ご返信ありがとうございます。

その後色々と調べてみた結果、ご三者様のご指摘通り、メモリリークが原因ではなく、
データバインドをしているデータの持ち方が原因でした。
※ご迷惑をお掛けして申し訳ございませんでした。

INotifyPropertyChangedインターフェースとBindingList型を組み合わせると
メモリリークが発生するものとばかり思っておりました。

本件は解決済みにさせて頂きます。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -