回答編集履歴

2

追記

2023/01/14 03:16

投稿

退会済みユーザー
test CHANGED
@@ -43,3 +43,48 @@
43
43
 
44
44
  ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2023-01-12/1c78e639-0294-4839-a374-9124c5988a8c.jpeg)
45
45
 
46
+ ---
47
+
48
+ **【追記】**
49
+
50
+ 質問のコメント欄の 2023/01/14 11:59 の私のコメントで「それに対するレスは私の回答欄に追記しておきます」と書いた件です。
51
+
52
+ > 頂いた参考例をもとに反映しました。こちら試したところ、スタートボタンを押した一回目だけメモリリークをおこし、(1000回処理だとぎり耐えます)2回目以降はリークを起こさない現象が起きました。理由がわからず困っています。
53
+
54
+ 質問者さんが追記した以下のコードでは「ループ内で使用しているgrayImage、thresholdImege、picを全て解放」になっていない、即ち pic が解放されてないからだと思います。
55
+
56
+
57
+ ```C#
58
+ for (int i=0; i<1000; i++)
59
+ {
60
+ //グレー化
61
+ using (var grayImage = image.CvtColor(ColorConversionCodes.BGR2GRAY))
62
+ //二値化
63
+ using (var thresholdImege = grayImage.Threshold(128, 255, ThresholdTypes.Binary))
64
+ {
65
+ pic = BitmapConverter.ToBitmap(thresholdImege);
66
+ pictureBox1.Image = pic;
67
+ }
68
+ }
69
+ ```
70
+
71
+ pic も開放する、すなわち以下のようにして試してみてください。
72
+
73
+ ```C#
74
+ for (int i=0; i<1000; i++)
75
+ {
76
+ //グレー化
77
+ using (var grayImage = image.CvtColor(ColorConversionCodes.BGR2GRAY))
78
+ //二値化
79
+ using (var thresholdImege = grayImage.Threshold(128, 255, ThresholdTypes.Binary))
80
+ using (pic = BitmapConverter.ToBitmap(thresholdImege))
81
+ {
82
+ // これはできないのでとりあえずコメントアウト
83
+ //pictureBox1.Image = pic;
84
+ }
85
+ }
86
+ ```
87
+ 何度実行してもメモリーリークは起こらないことが確認できるはずです。
88
+
89
+ だた、質問者さんのオリジナルのコード、追記版のコード、さらに上のように pic も開放するコードのいずれも 1,000 回実行する意味はない(1 回でも結果は同じ)ということは理解されているでしょうか?
90
+

1

追記

2023/01/12 03:05

投稿

退会済みユーザー
test CHANGED
@@ -1,4 +1,4 @@
1
- using 句の使い方。質問者さんのコードに適用して問題ないことが確認出来たら YAmaGNZ さんの回答にベストアンサーをつけてください。
1
+ YAmaGNZ さんが回答で言われている「ループ内で使用しているgrayImage、thresholdImege、picを全て解放」するための using 句の使い方のサンプルを書いておきます。質問者さんのコードに適用して問題ないことが確認出来たら YAmaGNZ さんの回答にベストアンサーをつけてください。
2
2
 
3
3
  ```C#
4
4
  using OpenCvSharp;