为什么反复创建释放多线程TTHREAD对象会引起内存溢出
我做了一个TTHREAD对象,里面就一个简单的字符串替换函数,其他什么都没有,也没有操作VCL
我在程序中会反复创建 并释放它,没有用 terminatethread 和exitthread,因为我用了freeonterminate:=true; 根据跟踪可以看到线程正常结束了,用CheckThreadFreed 也可以得到结束释放的返回。
但我的程序中有一个TADOQUERY的过程,创建一个TADOQUERY执行一个查询后释放。
程序运行中,会出现 outofmemory 错误,FASTMM提示“FastMM 已检测到一个错误, 当时正在进行 GetMem 操作. FastMM 检测到对已释放内存块内容的修改.”
但事实上,我的每个对象都有成对且有效的creat和free,在释放后,也没有对该对象进行操作。
对堆栈跟踪可以看到,是在新创建一个对象时,出现的。
当前线程的 ID 是 0x1F5C, 导致该错误的堆栈跟踪(返回地址):
40B3D4 [FastMM4][DebugGetMem]
40B62E [FastMM4][DebugReallocMem]
402F2F [System][@ReallocMem]
424C54 [Classes][TList.SetCapacity]
424ABC [Classes][TList.Grow]
4248CD [Classes][TList.Add]
42DE29 [Classes][TComponent.Insert]
42DE84 [Classes][TComponent.InsertComponent]
42DCCA [Classes][TComponent.Create]
4A3C40 [DB][TField.Create]
4A5517 [DB][TStringField.Create]
然后我不用这个TADOQUERY的过程,发现只要有其他需要分配内存的代码执行(对象自己的create)都会引起这种outofmemory。
我该怎么办?