Delphi - 从任务栏菜单关闭应用程序时无效的指针操作

时间:2013-02-17 10:57:56

标签: delphi delphi-xe

我有一个应用程序正在将所有动态创建的数据模块加载到TList中。应用程序在Windows XP OS下运行。从应用程序关闭按钮关闭应用程序时,代码正确执行。但是当从任务栏菜单关闭应用程序时,会引发无效指针操作。以不同方式关闭应用程序时,相同的代码行为不同。

负责销毁数据模块的代码

  for iPos := 0 to FDatamodules.Count - 1 do //FDataModules is of type TList
    if FDatamodules.Items[iPos] <> nil then 
      TDatamodule(FDatamodules.Items[iPos]).Free;

和堆栈

:7c812a6b kernel32.RaiseException + 0x52
System.TObject.FreeInstance
System.ErrorAt(2,$4A7FEFC)
System.Error(reInvalidPtr)
System.TObject.FreeInstance
System._ClassDestroy(???)
Classes.TDataModule.Destroy
System.TObject.Free
RBAFORM.TRBABaseForm.Destroy

LE:似乎从任务栏菜单关闭应用程序是向应用程序发送HALT(0)并释放数据模块。在图像下方:左侧是正常关闭动作的堆栈,右侧是任务栏菜单中关闭应用程序的堆栈。

enter image description here

1 个答案:

答案 0 :(得分:7)

这似乎是一个双重免费问题(就像LU对你的问题一样评论),这意味着你可以释放一次数据模块的实例。

当您使用Create(nil)创建实例时,它并非由任何人拥有,您可以安全地在其上调用Free。 (另见What is the meaning of nil owner in component constructor

如果使用Create(Form1)(非零参数)创建它,那么调用Free不再是您的责任。在此示例中,当Form1被释放时,它将自动释放。

为了确定发生了什么,你应该在FullDebugMode或类似的内存调试器中使用FastMM。内存调试器应该能够捕获问题并为您提供更多有用的信息。