开启左侧

MFC的并行化Parallel.For含非托管会内存泄露

[复制链接]
美琴小学生 发表于 2021-10-11 11:34:09 | 显示全部楼层 |阅读模式
Parallel.For,ref一个自定义结构体(含HObject),内存会逐步增加,代码如下
  1.         private void Test2()
  2.         {
  3.             int sum = 4000000;
  4.             Result_test2 RT = new Result_test2();
  5.             RT.Image = new HObject[sum];
  6.             RT.Image2 = new HObject();
  7.             HOperatorSet.GenEmptyObj(out RT.Image2);
  8.             HOperatorSet.GenRectangle1(out RT.Image2, 100, 100, 2000, 2000);
  9.             Parallel.For(0, sum, (int i) =>
  10.             {
  11.                 _test2(ref RT, i);
  12.             });

  13.             RT.Image2.Dispose();
  14.             for (int i = 0; i < sum; i++)
  15.             {
  16.                 RT.Image[i].Dispose();
  17.             }
  18.         }

  19.         private void _test2(ref Result_test2 RT, int index)
  20.         {
  21.             RT.Image[index] = new HObject();
  22.             HOperatorSet.GenEmptyObj(out RT.Image[index]);
  23.             HOperatorSet.GenRectangle1(out RT.Image[index], 100, 100, 2000, 2000);
  24.         }

  25.         public class Result_test2
  26.         {
  27.             public HObject[] Image;
  28.             public HObject Image2;
  29.         }
复制代码


读内存代码
  1.         private string GetRam()
  2.         {
  3.             try
  4.             {
  5.                 Process p = Process.GetCurrentProcess();

  6.                 if (p != null)
  7.                 {
  8.                     p.Refresh();
  9.                     double usedMemory = 0;
  10.                     string procName = p.ProcessName;
  11.                     using (PerformanceCounter pc = new PerformanceCounter("Process", "Working Set - Private", procName))
  12.                     {
  13.                         usedMemory = pc.NextValue() / 1024.0 / 1024.0;
  14.                     }
  15.                     return $" {usedMemory.ToString("F2")}MB";
  16.                 }
  17.                 return "GetRamEmpty";

  18.             }
  19.             catch (Exception ex)
  20.             {
  21.                 return "GetRamError" + ex.Message;
  22.             }
  23.         }
复制代码
 楼主| 美琴小学生 发表于 2021-10-11 11:37:21 | 显示全部楼层
循环2000+次Test2(),内存约增加100-300MB
 楼主| 美琴小学生 发表于 2021-10-11 11:48:29 | 显示全部楼层
此处struct和class都会泄露
  1. public class Result_test2
  2. {
  3.     public HObject[] Image;
  4.     public HObject Image2;
  5. }
复制代码
 楼主| 美琴小学生 发表于 2021-10-11 11:59:31 | 显示全部楼层
用的是VS2015,4.0的net框架,halcon12版
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表