繁体   English   中英

Delphi - 用10.2.1重新编译应用程序会导致内存泄漏?

[英]Delphi - Recompiling application with 10.2.1 causes memory leaks?

我刚刚安装了Delphi 10.2 Release 1.当我重新编译我的应用程序并运行它们时,我得到了很多内存泄漏。 10.2没有内存泄漏(没有更新)。 我也没有对代码进行任何更改。

为了验证,我创建了一个简单的空白应用程序,并在表单上放置了一些组件。 没有代码。 跑了应用程序并报告了内存泄漏。 内存泄漏来自示例应用程序

我想强调这一点(如果仅在升级之前作为警告)。

我的问题:

  1. 还有其他人看过这个问题吗?
  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()函数,如果MyThreadTThread对象:

MyThread = new MyThreadClass();

DeleteThisTh()是这个类的一个方法,我们可以在DeleteThisTh()里面等待终止的线程:

void MyThreadClass::DeleteThisTh(void) {
    Terminate();
    WaitFor();
    delete this;
}

OnTerminate事件中,我可以清理我的对象。 记笔记:

  1. OnTerminate之后调用delete this ;
  2. DeleteThisTh()存在于主线程中;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM