关于String 的out of memory错误,死活都找不到问题出在那里,老妖和各位专家帮忙诊断下
我最近闲来无事,写了个程序,从网上的网页上获取数据,然后显示在listview上。
本地存储用的是access数据库,数据量也不大,也就不超过500条数据,大部分时候都是100条以下。
程序分为几个部分:
主界面
读取网页源代码线程:这个线程主要功能是从网页上下载源代码,然后用string.pos.string.substring这些函数来分析出有用的数据,存储到一个datalist中。
数据库线程:当获取源代码线程工作完毕后,数据库线程启动,从datalist中读取数据,插入到access中,然后删除旧数据。操作完毕后,发消息告诉主进程
界面主进程:接受到有数据更新的消息后,从数据库中取出数据,并与现有listview中的数据比较,增加新增的数据,删除没有的数据.
listview采用virtual listview技术(其实数据也不多,一般也就30条左右,本不需要使用这个技术的,我纯属闲着没事),维护一个list,里面存放listview中的数据.
现在有个很奇怪的问题,在后台有线程工作的时候,上下拉动listview的滚动条,后台线程有时候会出现out of memory错误。读取网页线程和数据库线程都有这个问题,而且出错的地方都不太一样,但是有一点,都跟String 有关系。
读取网页线程出错的部分是在String.pos 或者给String 赋值部分。
数据库线程部分出错的地方是在给String相加的时候,比如
sql="insert ......into ..... ";
sql=sql+"where ....."; //出错代码
这个字符串不大,不超过100个字节,怎么会out of memory呢?
再说了,我的内存是4G,物理内存还有2个G是空闲的。我的这个程序占用内存在15M左右。
我从网上搜索了一下,有人也碰到这个问题,是在线程频繁操作ansistring的时候,据分析是由于内存碎片的缘故。我对此表示不太理解。为什么只有在线程操作string 的时候才出现碎片问题?并且我的程序的运行时间并不长。
我最不能理解的是在sql语句相加的时候出错,简直是没有道理,这么点空间难道都没有了吗?
这几天调试了很久,都没有找到问题的原因。详情各位专家来会诊一下,如果需要工程源代码来调试,也可以提供,这只是写着玩的程序,我是用bcb2010编译的.
[解决办法]
把Codeguard关闭就可以了。