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

时间:2017-08-09 10:56:54

标签: delphi memory-leaks delphi-10.2-tokyo

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

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

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

我的问题:

  1. 还有其他人看过这个问题吗?
  2. 我是否需要或可以采取措施摆脱这个问题?
  3. 注意:我在质量门户网站上记录了一个问题,以防这是一个真正的问题:https://quality.embarcadero.com/browse/RSP-18774。在这张票中,我还附上了示例应用程序。

2 个答案:

答案 0 :(得分:18)

经过一些调查后我发现传递给TThread.CurrentThread.ForceQueueTStyledControl.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:

  1. delete this is called after OnTerminate;
  2. DeleteThisTh() lives in the main thread;