gpt4 book ai didi

string - Delphi字符串内存泄漏?

转载 作者:行者123 更新时间:2023-12-02 11:50:54 25 4
gpt4 key购买 nike

我有一个程序,它接受 SQL 查询作为命令行参数,查询 PostgreSQL 数据库并生成以多种方式之一格式化的文件(最常见的是用于生成 CSV 文件)。

但是,该程序存在严重的内存泄漏 - 在一个生成 12MB 文件的特定查询中,该程序在操作系统杀死它之前使用了 8GB 的​​ RAM 以及几 GB 的交换空间。我想找出内存泄漏的原因。我不太了解 Delphi(从程序的质量来看,原作者也不是),但我的任务是找到一个快速修复的方法。

以下 doData 函数部分输出结果集的单行。我大胆猜测问题出在“复制”命令(在堆上创建一个永远不会释放的字符串),但我确信比我更有经验的人将能够确认这个答案或指出我方向正确。

procedure doData;
var
s, fldVal : string;
i, fldLen : integer;
begin
s := '';

for i := 0 to ds.Fields.Count-1 do
begin
if (ds.Fields[i].DataType = ftDate) or
(ds.Fields[i].DataType = ftDateTime) then
begin
if psql.outDate = 'i' then
fldLen := 8
else
fldLen := 10;

if ds.Fields[i].IsNull then
fldVal := ''
else
fldVal := formatDate(ds.Fields[i].AsDateTime);
end
else
begin
fldLen := ds.Fields[i].DisplayWidth;
fldVal := ds.Fields[i].AsString;
end;

if (psql.outType = 'd') or (psql.outType = 's') then
s := s + trim(fldVal)

else if psql.outType = 'f' then
begin
s := s + fldVal;

if fldLen - length(fldVal) > 0 then
s := s + copy(spaces, 1, fldLen - length(fldVal));
// Is this a memory leak above?
end;

if psql.outType = 's' then
begin
if i < ds.Fields.Count-1 then
s := s + psql.outDelimChar;
end
else
s := s + psql.outDelimChar;
end;

writeln(psql.outPrefixData + s);
end;

最佳答案

这段代码没有泄漏。 Delphi string 类型由编译器管理,不需要程序员显式释放内存。

如果您希望找到泄漏,您应该包含 FastMM 的完整调试版本。这将生成代码中任何泄漏的诊断报告,包括有助于识别泄漏内存最初分配位置的堆栈跟踪。

关于string - Delphi字符串内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24752282/

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