Windows 10 中的 CopyFile 内存泄漏

问题描述 投票:0回答:1

我注意到似乎存在内存泄漏影响我的代码,该代码只是复制目录树结构,这是自 Windows XP 以来一直在使用的一些代码,并且没有更改,并且以前没有表现出这种泄漏特征。

我在网上看到其他人提到过它,并将其归因于去年发送的更新中的一个错误,该错误影响了 NTDLL.DLL 中的某些功能。

所以我的Delphi代码很简单

function copyFiles(srcDirectory,dstDirectory:string;indent:string):boolean;
var
  searchRec     : TSearchRec;
  searchResult  : integer;
  srcName       : string;
  dstName       : string;
  srName        : string;
begin
  result:=true;

  srcDirectory:=includeTrailingPathDelimiter(srcDirectory);
  dstDirectory:=includeTrailingPathDelimiter(dstDirectory);

  createDirectoryTree(dstDirectory);

  searchResult:=findFirst(srcDirectory+'*.*',faAnyFile,searchRec);
  try
    while (searchResult=0) do
    begin
      if ((searchRec.attr and faDirectory)=faDirectory) then
      begin
        if (searchRec.name<>'.') and (searchRec.name<>'..') then
        begin
          if not copyFiles(srcDirectory+searchRec.Name,dstDirectory+searchRec.Name,indent) then
          begin
            result:=false;
          end;
        end;
      end
      else
      begin
        if (
            ((searchRec.attr and faReadOnly)=0) and
            ((searchRec.attr and faVolumeID)=0) and
            ((searchRec.attr and faSysFile)=0) and
            ((searchRec.attr and faHidden)=0)
            ) then
        begin
          srcName:=srcDirectory+searchRec.name;
          dstName:=dstDirectory+searchRec.name;

          clearReadOnly(srcName);
          clearReadOnly(dstName);

          if not copyFile(PChar(srcName),PChar(dstName),false) then
          begin
            logFmt('%sCopy %s to %s, failed',[indent,srcName,dstName],true);
            result:=false;
          end
          else
          begin
            logFmt('%sCopy %s to %s, success',[indent,srcName,dstName]);
          end;
        end;
      end;

      searchResult:=findNext(searchRec);
    end;
  finally
    try
      System.sysUtils.findClose(searchRec);
    except
    end;
  end;
end;

我很想听听自去年 3 月份更新到 Windows 10 以来遇到过 CopyFile 方法此问题的其他人的意见。

我还尝试使用 FindAllFiles 方法获取文件列表,然后复制并获得相同的效果,常见的是对 CopyFile 的调用,所以我相信这是我的问题的根源。

windows delphi memory-leaks windows-10
1个回答
0
投票

搜索完成后,需要调用

FindClose
来释放
FindFirst
分配的内存。

请参阅 FindClose 文档

© www.soinside.com 2019 - 2024. All rights reserved.