那些情况下可能会发生内存泄漏?现在用VB写了一个控件,调用了另外两个COM对象,一个是VC写的,一个是VB写的,测试发现有内存泄漏,短时间看不出来有MEMLEAK,用自动测试7个小时才发现很明显的MEMLEAK。
解决方案 »
- 急求:请问关于判断一个点是否在任意多边形内,这个点能否是单精度型的,哪位大哥大姐给看看
- 获取指定机器的系统时间
- 有没有第三方的 类似WebBrowser1控件 功能强大点的 浏览速度快的!
- vb对MediaPlayer控件的控制
- 在EXCEL中的排序是如何处理的啊,我想利用它
- 用ADO访问ACCESS 2000时候打开数据库的问题,急救!!
- who 有spread的中文帮助,急,谢了!!!!
- do while循环中怎么退出当前循环跳到下一循环中去? (续..)
- 如何解决“ActiveX部件不能创建对象”问题
- VB程序可以带参数运行,但能否向外传递参数呢?
- 我编好的VB程序在VB上运行时总是说未定义子程序中定义
- 困惑 为什么声明这个变量就出错呢?
Dim hr As Long
Dim rclsid As GUID
Dim riid As GUID
Dim Context As Long
Dim ServerInfo As COSERVERINFO
Dim AuthInfo As COAUTHINFO
Dim mqi As MULTI_QI
Dim radServer As RSRadMgr.Automation
Dim almObject As Object Dim className As String
Dim desStr As String rclsid.Data1 = &H111DF4A2
rclsid.Data2 = &H68F0
rclsid.Data3 = &H11D2
rclsid.Data4(0) = &H94
rclsid.Data4(1) = &HFA
rclsid.Data4(2) = &H0
rclsid.Data4(3) = &HC0
rclsid.Data4(4) = &H4F
rclsid.Data4(5) = &H8E
rclsid.Data4(6) = &HD4
rclsid.Data4(7) = &HA1 riid.Data1 = &H111DF4A1
riid.Data2 = &H68F0
riid.Data3 = &H11D2
riid.Data4(0) = &H94
riid.Data4(1) = &HFA
riid.Data4(2) = &H0
riid.Data4(3) = &HC0
riid.Data4(4) = &H4F
riid.Data4(5) = &H8E
riid.Data4(6) = &HD4
riid.Data4(7) = &HA1 mqi.hr = 0
Set mqi.pItf = Nothing
mqi.pIID = VarPtr(riid) AuthInfo.dwAuthnSvc = RPC_C_AUTHN.RPC_C_AUTHN_WINNT
AuthInfo.dwAuthzSvc = RPC_C_AUTHZ.RPC_C_AUTHZ_NONE
AuthInfo.pwszServerPrincName = vbNullString
AuthInfo.dwAuthnLevel = RPC_C_AUTHN_LEVEL.RPC_C_AUTHN_LEVEL_NONE
AuthInfo.dwImpersonationLevel = RPC_C_IMP_LEVEL.RPC_C_IMP_LEVEL_IMPERSONATE
AuthInfo.pAuthIdentityData = vbNullString
AuthInfo.dwCapabilities = RPC_C_QOS.RPC_C_QOS_CAPABILITIES_DEFAULT ServerInfo.dwReserved1 = 0&
ServerInfo.dwReserved2 = 0&
ServerInfo.pAuthInfo = VarPtr(AuthInfo)
ServerInfo.pwszName = StrPtr(sServerName)
Context = CLSCTX_SERVER ' Create an instance of the Load Manager
hr = CoCreateInstanceEx(rclsid, CLng(0), Context, ServerInfo, CLng(1), mqi)If hr < 0 Or mqi.hr < 0 Then
desStr = "Could not start load manager" 'LoadResString(IDS_CouldNotStartLoadManager)
hr = vbObjectError + 2 ' Set a user defined error code
Err.Raise Number:=hr, Description:=desStr
Exit Function
End If Set radServer = mqi.pItf
If radServer Is Nothing Then
desStr = "Set Load Manager Failed" 'LoadResString(IDS_SetLoadManagerFailed)
desStr = desStr & Hex(Err.Number)
hr = vbObjectError + 2 ' Set a user defined error code
Err.Raise Number:=hr, Description:=desStr
Exit Function
End If
'{2E53D61F-D836-11D0-BEE4-080009B3AC18}
Set almObject = radServer.StartServer("{E17C000C-204E-11D4-AB9A-00C04F9915E3}", hr)
If hr < 0 Then
desStr = "Create RAD Server Failed" 'LoadResString(IDS_CreateObjectExFailed)
desStr = desStr & Hex(hr)
hr = vbObjectError + 3 ' Set a user defined error code
Err.Raise Number:=hr, Description:=desStr
Exit Function
End If Set GetAlmServer = almObject
If GetAlmServer Is Nothing Then
desStr = "Create GetAlmServer Failed" 'LoadResString(IDS_GetSpcServerSetFailed)
desStr = desStr & Hex(Err.Number)
hr = vbObjectError + 4 ' Set a user defined error code
Err.Raise Number:=hr, Description:=desStr
Exit Function
End If
2、一个是vb写的com进程内组件ExtractData,通过他向log server请求log数据,并且将请求得到的数据以事件的方式通知控件LogViewer,
3、控件LogViewer也是vb写得控件,上面有一个datagrid和adodc控件,
4、通过vb那个组件ExtractData的函数HistSvrCallback_NewHistoricalData(这是log server接收到数据的通知函数)中将数据处理后加入到一个recordset中,然后通过它触发的事件来通知控件,将这个纪录集传给adodc控件的recordset,然后在datagrid里面显示log数据。
5、当我在一个程序中打开一个使用这个控件来显示数据的窗口,等数据取到后,然后关闭窗口,然后再打开,重复这样的过程,大约4个小时候(大约1000次这样的关闭窗口),程序使用内存会从17,344k增到29,792k,如果让他这样测试10个小时的话,使用的内存会长到300多m,我512m的机器,整个程序会死掉。
很多类提供了释放内存的方法,如果在调用他们之前就Set为Nothing,就会产生一个内存泄露。
如果把对象放在一个集合中,然后直接将这个集合Set为Nothing,也很可能产生内存泄露。应该调用所有对象的释放方法——如果存在的话,再将对象Set为Nothing,然后再将集合中的对象一一Remove,最后再将集合Set为Nothing