簡體   English   中英

字符串中的Delphi內存泄漏?

[英]Delphi memory leak in string?

我有一個程序,該程序接受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的完整調試版本。 這將生成有關代碼中任何泄漏的診斷報告,包括有助於識別泄漏內存最初分配位置的堆棧跟蹤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM