非常感谢大家的回复。
Dnereb,我将尝试在过程结束之前将所有SelectedSet设置为零(我相信唯一可能导致内存泄漏的变量是SelectedSet变量。我没有这样做,我认为清除并删除此变量就足够了。我通常在
使用SelectionSet变量的过程的末尾写
....
....
On Error Resume Next
objAcSelSet1.Clear
objAcSelSet1.Delete
On Error GoTo 0
End Sub
。由于所有这些变量都被声明为局部变量,我认为VB在过程之后释放了这些变量的内存,但也许内存没有被释放。如果它有效,我将再次在这个论坛上写信。
Bryco非常感谢您对欧特克论坛讨论的参考。我读了它,它给了我一些解决问题的想法(例如尝试从SelectitchSets集合中删除选择集,使用内存功能进行调试等)。关于 Erase 语句的使用:在我的代码中,我使用了一些绘图实体数组,即一维的动态数组(例如:
Dim objAcEntArrVigas() As AutoCAD.AcadEntity
),它们用于首先指向选择集的元素,然后将元素排序到数组中,使数组中元素的顺序与图形中数组所指向的实体的某些顺序相同(我用它来计算稍后在图形中排序的图元之间的距离。).由于数组是动态数组,我使用 Erase 语句释放之前数组使用的内存,然后使用 ReDim 为数组分配新大小的内存:
[代码 1]
对于固定大小的数组,擦除仅清除数组,它不会像您所说的那样恢复内存,但我只对动态数组使用 Erase。
Keith和Bob感谢,关于例程中的选择集,我遇到了问题(是计算平面结构元素上的力和力矩的例程,如梁上的力矩和力等)在具有最大深度水平的程序中,我有4个选择集,我认为选择集并不多, 并且每个集合的元素数小于1000(也许有时其中一个集合可以达到这个元素数。我通常写:
Private Sub PlanoActualizar(blnPlanta As Boolean, intPlanta As Integer, blnReCalculables As Boolean _
, blnContinuar As Boolean, udtError As mdlUtilidades01.tError)
' DECLARACIONES:
Dim objAcSelSet1 As AutoCAD.AcadSelectionSet
....
....
....
' INSTRUCCIONES:
blnContinuar = True
blnError = False
Call ErrorAnular(udtError)
' Línea de errores no controlados.
' Line of not-controlled errors.
On Error GoTo linError0
' At the beginning of procedures I inicialize the SelectionSet variables.
' If I need to use a SelectionSet inside For....Next, I clear It in each loop, I don't create it again.
str1 = "PlanoActualizarAcSelSet1"
Set objAcSelSet1 = ThisDrawing.SelectionSets.Add(str1)
objAcSelSet1.Clear
If blnContinuar Then
....
....
....
End If
' Línea de errores no controlados.
' Line of not-controlled errors.
linError0:
If (Err 0) Then
Call ErrorRetornar(Err, udtError)
Resume linError0
End If
On Error GoTo 0
On Error Resume Next
' Clears the set of his items.
objAcSelSet1.Clear
' Delete the set.
objAcSelSet1.Delete
On Error GoTo 0
End Sub
在执行例程后,所有由例程创建的选择集都从绘图中删除,但内存没有被释放。在某些过程中,我通过引用传递选择集,但是当执行返回到声明的过程时,这些选择集将被销毁。
好吧,我会继续解决它...非常感谢(抱歉我的英语不好。