[MSV8i C#] 内存释放问题

各位老师好,

      我在调用CreateSharedCellElement2方法后,发现内存增加,因为要重复调用很多次,所以就出现了程序崩溃的问题。

      我想问下如何释放这部分内存?

Parents Reply Children
  •             Matrix3d xMatrix = app.Matrix3dFromAxisAndRotationAngle(2, xRadians);
                Matrix3d zMatrix = app.Matrix3dFromAxisAndRotationAngle(0, -zRadians); 
                Matrix3d yMatrix = app.Matrix3dFromAxisAndRotationAngle(1, yRadians);
    
                Point3d scale3d = app.Point3dFromXYZ(scale, scale, scale);
    
                SharedCellElement cell = null;
    
                try
                {
                   
                    Matrix3d rMatrix = app.Matrix3dFromMatrix3dTimesMatrix3dTimesMatrix3d(ref xMatrix, ref yMatrix, ref zMatrix);
                    
                    cell = app.CreateSharedCellElement2(name, ref ptOnAlignment, ref scale3d, true, ref rMatrix);
                    if (cell != null)
                    {  
                        cell.Color = color;
                        cell.Level = level;
                        app.ActiveModelReference.AddElement(cell);    
                    } 
                }
                catch (InvalidCastException ex)
                {
                    Console.Write(ex.Message);
                }
                       
                return cell;

    老师,您好,我每次跟踪代码,发现执行“cell = app.CreateSharedCellElement2(name, ref ptOnAlignment, ref scale3d, true, ref rMatrix);”这句内存就增长

  • 取消最后一行这个return cell试一下。已经AddElement添加到模型中了还要返回这个cell的目的是什么?

    在AddElement后增加cell=null;看能否及时清除内存。



  • 符老师,您好!我return这个cell的目的是为了后面对这个单元进行移动,但是我刚刚也删掉return cell,并且增加了cell=null试了一下,发现也不行,在执行CreateSharedCellElement2时增加的内存,并没有随着方法结束而清除。

  • C#里边引用对象的实例如果没有变量再引用的话,实例在堆上占用的内存是随后某个时刻由GC自动回收的。不用程序员去管理,而且程序也是无法控制的,除非占用的一些非托管资源,如文件句柄数据库链接等,这个时候要在类里边重写Finalize、Dispose等函数,可以通过调用这些函数去释放这些资源。显然这里SharedCell不属于这种情况。我猜测异常还是因为创建SharedCell时传入的参数有问题导致的。

  • 郭老师,如果您的测试样例里面调用CreateSharedCellElement2这个方法,共享单元的dgn文件大小为5M左右,您那里不会出现内存不断增长的问题?