各位老师好,
我在调用CreateSharedCellElement2方法后,发现内存增加,因为要重复调用很多次,所以就出现了程序崩溃的问题。
我想问下如何释放这部分内存?
C#里边Manged类型的实例不需要程序员去负责内存释放的问题。程序崩溃可能是别的原因,请上传一下您的代码,我帮您分析一下。
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左右,您那里不会出现内存不断增长的问题?