gpt4 book ai didi

Delphi:如何查找并修复 EOutOfMemory 错误?

转载 作者:行者123 更新时间:2023-12-03 14:49:41 24 4
gpt4 key购买 nike

我正在构建一个进行科学模拟的delphi应用程序。它的复杂性不断增加,现在由许多单元和形式组成。

每次运行时我都会开始收到 EOutOFMemory 错误。它似乎发生在我在函数中临时使用变体数组期间或之后。冒着问一个非常愚蠢的问题的风险,“变体数组”是在自找麻烦吗? (我可以将所有内容都转换为字符串,但原则上变体数组可以节省很多捏造的东西)。

有问题的数组使用可能是:

 Function  TProject.GetCurrentProjParamsAsArray(LProjectName, LProjectType : ShortString): ArrayOfVariant;
Var
ArrayIndex : Word;
begin
SetLength (Result,54);
ArrayIndex := 0;
Result [ArrayIndex] := LProjectName; Inc(ArrayIndex);
Result [ArrayIndex] := LProjectType; Inc(ArrayIndex); // this structure makes it easier to add extra fields in the DB than hard coding the array index!!
Result [ArrayIndex] := FileTool.DateTimeForFileNames ; Inc(ArrayIndex);
Result [ArrayIndex] := SiteAndMet. SiteName ; Inc(ArrayIndex);
Result [ArrayIndex] := SiteAndMet. PostCode ; Inc(ArrayIndex);
Result [ArrayIndex] := SiteAndMet. MetFileNamePath ; Inc(ArrayIndex);
Result [ArrayIndex] := SiteAndMet. SiteLat ; Inc(ArrayIndex);
Result [ArrayIndex] := SiteAndMet. SiteLong ; Inc(ArrayIndex);
Result [ArrayIndex] := SiteAndMet. SiteAlt ; Inc(ArrayIndex);
Result [ArrayIndex] := SiteAndMet. TZoneIndex ; Inc(ArrayIndex);
Result [ArrayIndex] := SiteAndMet. TZoneHours ; Inc(ArrayIndex);
Result [ArrayIndex] := SiteAndMet. TZoneMeridian ; Inc(ArrayIndex);
Result [ArrayIndex] := SiteAndMet. Albedo ; Inc(ArrayIndex);
Result [ArrayIndex] := SiteAndMet. ArrayTilt ; Inc(ArrayIndex);
Result [ArrayIndex] := SiteAndMet. ArrayAzimuth ; Inc(ArrayIndex);

在任务管理器中 - 峰值内存使用量为 42MB,VM 为 31M,每次运行时出现约 90,000 个页面错误。 (在具有 3GB 内存的 xp 机器上)

有人有关于监视应用程序中不同组件的内存使用情况的一般提示吗?或者追踪这个错误的原因?

最近我已经从将主要项目数据存储为 CSV 转为使用 ADO DB,同时,我也开始使用 Variant 数据类型,而不是一直在字符串和单/ double 之间进行转换。

我遵循了各种节省内存的技巧,例如,在实用的情况下,我删除了 Application.CreateForm(TProject, Project); .dpr 中的语句并动态创建它们。 (除非大部分时间都使用表格)。一般来说,我使用最小的实用数据类型(字节、短字符串等)并最小化“公共(public)”变量和函数的使用

非常欢迎任何提示,布莱恩

最佳答案

当内存管理器无法为给定的分配请求找到连续的内存块时,就会发生

EOutOfMemory。因此,您要么 1) 分配比预期更多的内存,2) 泄漏已成功分配的内存,或 3) 内存碎片(不一定泄漏),因此内存管理器必须随着时间的推移不断分配越来越多的内存。

当异常发生时,查看调用堆栈。这将导致您发现无法分配内存的代码。要获取调用堆栈,请在调试器中运行应用程序,或使用异常日志记录框架,例如 MadExcept、EurekaLog、JCLExcept 等。

关于Delphi:如何查找并修复 EOutOfMemory 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10031947/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com