如何判断我的对象在关闭窗体后没有正常释放呢?应该看哪里.
如何看我的对象实例化后,在关闭窗体体没有释放。通过看任务管理器中的句柄可以吗?
还是看别的地方。反正内存占用在一直增加。我就是不知问题出在哪里。
我写的程序运行几次后,内存增加,如何知道是不是对象没有释放呢?
我写的是一个c/s程序,后台是sqlserver2000,前台用的是vb,关键是我如何知道我的程序是不是有内存泄露,因为运行几次后,内存就要大增.
我不知如何查,是不是我没有将对象释放,可是如何看呢?
我看任务管理器中进程中的内存数大增.但是如何看是不是对象没有释放呢?是不是看句柄数呀,
看句柄数意义大吗?
在我的程序窗体中用到了ado记录集对象。连接对象,还是自定义的一个数据库操作类对象。(这个类就是对ado一些对象的封装)
内存增加应该是我程序的问题,我现在的目的是找到问题出在哪,但是我不知道是不是由于我的对象没有正常释放造成内存泄露造成的.请大家指教.
[解决办法]
放心号了,VB不会出现泄露现象。
如果你使用了API,则按照你在其他语言使用的方式处理。
如果用了太多的控件,数据结构,注意把不用的释放,不释放也不会泄露,只要你保证软件退出时执行到 end 语句。
[解决办法]
if Not yourobject is nothing then
debug.print "your object is still alive "
End If
[解决办法]
对于GDI对象是不是导致内存泄露,用Windows XP带的Windows Task Manager--> View菜单--〉Select Column--> 选上GDI Objects--> Processes Tab Windows--> 在VB IDE中运行你的程序几次看看GDI Objects有没有增加。
[解决办法]
VB 会有内存释放,不过不容易引起崩溃而已。
比如:
== Parent.cls ==
Option Explicit
Private m_Children As Collection
Sub Add(ByVal c As Child)
m_Children.Add c, c.Name
Set c.Parent = Me
End Sub
Private Sub Class_Initialize()
Set m_Children = New Collection
End Sub
== Child.cls ==
Public Name As String
Public Parent As Parent
== Form1.frm ==
Private Sub Form_Load()
Timer1.Interval = 1
End Sub
Private Sub Timer1_Timer()
Dim p As Parent
Dim c As Child
Set p = New Parent
Set c = New Child
c.Name = "A "
p.Add c
End Sub
运行该程序就会在任务管理器中发现内存不停增长。
原因是 VB 中的对象均遵循 COM 的 IUnknow 接口,对象引用一次引用计数加一、对象释放一次引用计数减一,如果引用计数为零就自动释放对象。
例子中的 Parent 对象:
Set p = New Parent 引用计数加一(值 1)
在 p.Add c 中调用 Set c.Parent = Me 引用计数加一(值 2)
过程 Timer1_Timer 结束会有一个自动的 set p = nothing 而引用计数减一(值 1)
最终应为引用计数非零而没有释放 Parent 对象。
例子中的 Child 对象同理可得。
向这种对象 p 和 c 由于互相引用而导致内存泄漏的问题属于最常见的循环引用的问题,要解决也很简单:
在 Parent 中添加 Clear 方法,将 Child.Parent 设为 Nothing 并从 m_Children 中清除;
调用 Parent 结束时(Set p = nothing 前)先调用 Clear 方法。