vb释放内存

changleqy 2009-03-22 05:43:39
我有一个主函数,需要无限次调用若干个子函数,每次运行大概一小时后(大概调用5000次),就会出现内存溢出而程序出错的问题,我自己分析原因可能在以下一些地方,但不确定。

第一、
我在子函数里使用了一些excel对象与conn,recordset对象,使用完后都做了set xx=nothing处理
Set xlApp = New Excel.Application
Set xlbook = xlApp.Workbooks.Open(fileName)
Set xlsheet = xlbook.Worksheets(1)
.....
xlbook.Close
Set xlsheet = Nothing
Set xlbook = Nothing
xlApp.Quit
Set xlApp = Nothing


Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
.........
rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing


第二,我在子函数里定义了一些静态自定义结构数组与常规变量,每次都没做释放,不知是否有影响?
dim szSX(1 to 500) as tpSX 'tpSX为自定义Type
dim a as integer
dim b as double
.....


第三,我的子函数里使用到了以下一些API函数
Public Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
Public Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Public Declare Function WindowFromPoint Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Public Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Public Declare Function GetDesktopWindow Lib "user32" () As Long
Public Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long) As Long

测试了两天,还是没有找到原因,请高手指点一下,谢谢!

...全文
1122 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
changleqy 2009-03-25
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 Tiger_Zhao 的回复:]
GetWindowDC 获得的句柄需要用 ReleaseDC 释放!
检查任务管理器中该进程句柄数。
[/Quote]

解决了,原因就在这里!谢谢!
若一直使用GetWindowDC而不释放,经过数万次的运行后,程序就会崩溃。
Tiger_Zhao 2009-03-24
  • 打赏
  • 举报
回复
那么“User 对象”呢?
changleqy 2009-03-24
  • 打赏
  • 举报
回复
句柄数是什么意思呢?是否指进程管理器之中的进程数?
程序运行,进程数33
........
d = GetDesktopWindow()
dd = GetWindowDC(d)
'执行以上程序后,进程数33
.......
If dd Then ReleaseDC 0&, dd
If d Then ReleaseDC 0&, d
'执行以上程序后,进程数33

从进程数上来看,释放前后没有变化。
我先使用ReleaseDC运行程序一段时间看看。
Tiger_Zhao 2009-03-24
  • 打赏
  • 举报
回复
问题要一个一个解决。
先检查句柄数,然后添加 ReleaseDC,告诉我们结果。然后讨论其它。
changleqy 2009-03-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 Tiger_Zhao 的回复:]
GetWindowDC 获得的句柄需要用 ReleaseDC 释放!
检查任务管理器中该进程句柄数。
[/Quote]谢谢你的答复!
我的代码中是如下使用API的:
while temp=true
d = GetDesktopWindow()
dd = GetWindowDC(d)
p1.x = 500
p1.y = 19
Call SetCursorPos(p1.x, p1.y) '设置鼠标位置
l = GetPixel(dd, p1.x, p1.y) '获得该点色彩
mouse_event MOUSEEVENTF_ABSOLUTE Or MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, p1.x, p1.y, 0, 0 '在该点单击左键
....
wend

请帮忙看看其他API函数是否还有问题?
sstlwg 2009-03-23
  • 打赏
  • 举报
回复
MARK 。
lmhcs 2009-03-23
  • 打赏
  • 举报
回复
个人感觉,应该是2,我前一阵子在写彩色语法的程序是,用的richtextbox控件,在测试时,但打开的文件很大,然后把文本赋值到变量是发现内存会飙升,且函数调用过后内存并没有降低下来。后来改用api实现同样的功能,就好了。所以跟人感觉,一些变量,即使私有变量,还是最好释放。
mfkinfo 2009-03-23
  • 打赏
  • 举报
回复
同意楼上赵老师的意见,就列出代码没有发现其他问题。
Tiger_Zhao 2009-03-23
  • 打赏
  • 举报
回复
GetWindowDC 获得的句柄需要用 ReleaseDC 释放!
检查任务管理器中该进程句柄数。
zhufenghappy 2009-03-23
  • 打赏
  • 举报
回复
感觉不应该这样,肯定是你的调用函数什么的计算量太大,导致失败
changleqy 2009-03-22
  • 打赏
  • 举报
回复
http://dev.rdxx.com/VC/2004-2/14/041402796_2.shtml
4. 隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。

对照症状,我怀疑是调用API函数时存在以上问题,请高人指点一二。
changleqy 2009-03-22
  • 打赏
  • 举报
回复
我的内存是2G,程序出错后调用进程管理器显示的内存消耗大概是400M/3000M,但是屏幕显示速度很慢,感觉内存不足的样子。将VB程序关闭掉重新打开后好像内存又被释放掉了,依然能执行1个小时。
changleqy 2009-03-22
  • 打赏
  • 举报
回复
做了测试了,我将原来函数中定义的dim szSX(1 to 500) as tpSX 转移到模块中定义为公共变量,问题依然存在,看来不是数组的缘故。
会不会是API函数调用次数过多内存未及时释放引起的呢?
DengXingJie 2009-03-22
  • 打赏
  • 举报
回复
先要找到原因,你就一点一点的来测试,即先把第一个子函数单独放在一个for块中,看能否出现类似的问题,然后再试第二个、第三个...
自己都觉得这个方法好笨,但也许是有效的方法
changleqy 2009-03-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 chenjl1031 的回复:]
估计是第二个问题,每次用完数组后,要清空数组对象:Erase szSX
[/Quote]
谢谢!
但我查了资料,对于integer数组,erase好像只是将所有元素设置为0,并没有讲到释放内存。对于自定义类型的数组,则没查到,我可以试试看。
东方之珠 2009-03-22
  • 打赏
  • 举报
回复
估计是第二个问题,每次用完数组后,要清空数组对象:Erase szSX

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧