![](/img/trans.png)
[英]Using delphi application's memory manager in a delphi DLL (without recompiling the application)
[英]Delphi - Recompiling application with 10.2.1 causes memory leaks?
我刚刚安装了Delphi 10.2 Release 1.当我重新编译我的应用程序并运行它们时,我得到了很多内存泄漏。 10.2没有内存泄漏(没有更新)。 我也没有对代码进行任何更改。
为了验证,我创建了一个简单的空白应用程序,并在表单上放置了一些组件。 没有代码。 跑了应用程序并报告了内存泄漏。
我想强调这一点(如果仅在升级之前作为警告)。
我的问题:
注意:我在质量门户网站上记录了一个问题,以防这是一个真正的问题: https : //quality.embarcadero.com/browse/RSP-18774 。 在这张票中,我还附上了示例应用程序。
经过一些调查后,我发现传递给TStyledControl.KillResourceLink
中的TThread.CurrentThread.ForceQueue
的回调永远不会被执行,因为在任何线程可以处理它们之前,应用程序正在结束,并且TThread
类析构函数正在销毁仍然有未处理回调的列表。
我加入到呼叫解决了这个CheckSynchronize
在年底FMX.Forms.DoneApplication
迫使回调后才能执行解决严重的内存泄露。
我不知道这是否是问题的正确解决方案,但它解决了报告的内存泄漏问题。
我在FMX和VCL应用程序中使用C ++ Builder 10.2.1时遇到同样的问题。
如果我启用CodeGuard,我会在应用程序退出时出现内存泄漏。
我有一个带有OnTerminate
处理程序的TThread
:如果我在这个处理程序中放置一个断点,当我关闭程序时,它永远不会被调用。
如果我将CheckSynchronize()
放在我的主应用程序表单的析构函数中,问题仍然存在。
我的解决方案是在主窗体的析构函数中这样的“可怕”循环:
__fastcall TForm3::~TForm3(void) {
for(int i = 0; i < 10; i++) {
Sleep(1);
CheckSynchronize();
}
}
此解决方案不是确定性的,但可以在您的应用程序中以调试模式使用,以避免CodeGuard错误消息。
另一种解决方案是使用WaitFor()
函数,如果MyThread
是TThread
对象:
MyThread = new MyThreadClass();
而DeleteThisTh()
是这个类的一个方法,我们可以在DeleteThisTh()
里面等待终止的线程:
void MyThreadClass::DeleteThisTh(void) {
Terminate();
WaitFor();
delete this;
}
在OnTerminate
事件中,我可以清理我的对象。 记笔记:
OnTerminate
之后调用delete this
; DeleteThisTh()
存在于主线程中;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.