我刚刚安装了Delphi 10.2 Release 1.当我重新编译我的应用程序并运行它们时,我得到了很多内存泄漏。 10.2没有内存泄漏(没有更新)。我没有对代码进行任何更改。
为了验证,我创建了一个简单的空白应用程序,并在表单上放置了一些组件。没有代码。跑了应用程序并报告了内存泄漏。
我想强调一下(如果仅在升级之前作为警告)。
我的问题:
注意:我在质量门户网站上记录了一个问题,以防这是一个真正的问题:https://quality.embarcadero.com/browse/RSP-18774。在这张票中,我还附上了示例应用程序。
答案 0 :(得分:18)
经过一些调查后我发现传递给TThread.CurrentThread.ForceQueue
中TStyledControl.KillResourceLink
的回调永远不会被执行,因为在任何线程可以处理它们之前,应用程序正在结束,TThread
类析构函数是销毁仍有未处理回调的列表。
我通过在CheckSynchronize
末尾添加对FMX.Forms.DoneApplication
的调用来解决这个问题,这会强制执行回调,从而解决了巨大的内存泄漏问题。
我不知道这是否是解决问题的正确方法,但它解决了报告的内存泄漏问题。
答案 1 :(得分:0)
I have the same problem using C++Builder 10.2.1 in FMX and in VCL applications.
If I enable CodeGuard, I get memory leaks on application exit.
I have a TThread
with OnTerminate
handler: if I put a breakpoint in this handler, when I close the program it is never called.
If I put CheckSynchronize()
in the destructor of my main application form, the problem remains.
My solution was a "horrible" loop like this in the destructor of the main form:
__fastcall TForm3::~TForm3(void) {
for(int i = 0; i < 10; i++) {
Sleep(1);
CheckSynchronize();
}
}
This solution is not deterministic but may be used in your application in debug mode to avoid CodeGuard error messages.
Another solution is using the WaitFor()
function if MyThread
is a TThread
object:
MyThread = new MyThreadClass();
and DeleteThisTh()
is a method of this class, we can wait for terminated thread inside DeleteThisTh()
:
void MyThreadClass::DeleteThisTh(void) {
Terminate();
WaitFor();
delete this;
}
In the OnTerminate
event, I can clean my objects. Take note:
delete this
is called after OnTerminate
;DeleteThisTh()
lives in the main thread;