代码之家  ›  专栏  ›  技术社区  ›  Rohit

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

  •  13
  • Rohit  · 技术社区  · 8 年前

    我刚刚安装了Delphi 10.2 Release 1。当我重新编译应用程序并运行它们时,我遇到了大量内存泄漏。我在10.2版本中没有内存泄漏(没有更新)。我也没有修改代码。

    Memory leaks from the sample application

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

    1. 还有其他人看到过这个问题吗?
    2. 为了解决这个问题,我需要或可以做些什么?

    我在质量门户网站上记录了一个问题,以防这是一个真正的问题: https://quality.embarcadero.com/browse/RSP-18774

    2 回复  |  直到 8 年前
        1
  •  18
  •   Stefan Glienke    8 年前

    经过调查,我发现回调被传递给 TThread.CurrentThread.ForceQueue 在里面 TStyledControl.KillResourceLink TThread

    我通过给 CheckSynchronize 在…的结尾 FMX.Forms.DoneApplication

    我不知道这是否是该问题的正确修复方法,但它解决了所报告的内存泄漏问题。

        2
  •  0
  •   Remy Lebeau    8 年前

    在FMX和VCL应用程序中使用C++Builder 10.2.1时,我也有同样的问题。

    如果启用CodeGuard,应用程序退出时就会出现内存泄漏。

    TThread OnTerminate 处理程序:如果我在这个处理程序中放置一个断点,当我关闭程序时,它永远不会被调用。

    CheckSynchronize() 在我的主申请表的析构函数中,问题仍然存在。

    我的解决方案是在主窗体的析构函数中出现这样一个“可怕”的循环:

    __fastcall TForm3::~TForm3(void) {
        for(int i = 0; i < 10; i++) {
            Sleep(1);
            CheckSynchronize();
        }
    }
    

    此解决方案不是确定性的,但可以在调试模式下的应用程序中使用,以避免CodeGuard错误消息。

    另一种解决方案是使用 WaitFor() 函数if MyThread 是一个 t线程

    MyThread = new MyThreadClass();
    

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

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

    终止 事件,我可以清理我的对象。注意:

    1. delete this ;
    2. 生活在主线中;