我的德尔菲计划似乎在泄漏

Clo*_*web 4 memory delphi memory-leaks

好吧,所以我对Delphi很陌生(正如你从我的代码中看到的那样 - 尽量不要笑得太厉害并且伤害自己),但我已经设法制作了一个小桌面画布颜色选择器.它有效,有点,这就是我在这里的原因:D

它似乎在泄漏.它使用大约2 MB的内存开始,每秒爬升大约2 kB,直到10分钟左右达到大约10 MB.在我的双核2.7 ghz cpu上,它使用5%到20%的CPU功率,波动.在没有停止计时器的情况下运行约10分钟后,我的计算机没有响应.

您可以在下面的源代码中看到我正在释放TBitmap(或尝试,不确定它是否正在执行它,似乎没有工作).

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  GetCursorPos(MousePos);

  try
    Canvas1 := TCanvas.Create;
    Canvas1.Handle := GetDC(0);
    Pxl  := TBitmap.Create;
    Pxl.Width  := 106;
    Pxl.Height := 106;
    W := Pxl.Width;
    H := Pxl.Height;
    T := (W div 2);
    L := (H div 2);
    Zoom := 10;
    Rect1 := Rect(MousePos.X - (W div Zoom), MousePos.Y - (H div Zoom), MousePos.X + (W div Zoom), MousePos.Y + (H div Zoom));
    Rect2 := Rect(0, 0, H, W);
    Pxl.Canvas.CopyRect(Rect2, Canvas1, Rect1);
    Pxl.Canvas.Pen.Color := clRed;
    Pxl.Canvas.MoveTo(T, 0);
    Pxl.Canvas.LineTo(L, H);
    Pxl.Canvas.MoveTo(0, T);
    Pxl.Canvas.LineTo(W, L);
    Image1.Picture.Bitmap := Pxl;
  finally
    Pxl.Free;
  end;

  try
    Pxl2 := TBitmap.Create;
    Pxl2.Width  := 1;
    Pxl2.Height := 1;
    Box1 := MousePos.X;
    Box2 := MousePos.Y;

    BitBlt(Pxl2.Canvas.Handle, 0, 0, 1, 1, GetDC(0), Box1, Box2, SRCCOPY);
    C := Pxl2.Canvas.Pixels[0, 0];
    Coord.Text := IntToStr(Box1) + ', ' + IntToStr(Box2);
    DelColor.Text := ColorToString(C);
    HexColor.Text := IntToHex(GetRValue(C), 2) + IntToHex(GetGValue(C), 2) + IntToHex(GetBValue(C), 2);
    RGB.Text := IntToStr(GetRValue(C)) + ', ' + IntToStr(GetGValue(C)) + ', ' + IntToStr(GetBValue(C));
    Panel1.Color := C;
  finally
    Pxl2.Free;
  end;
end;

procedure TForm1.OnKeyDown(Sender: TObject; var Key: Char);
begin
  if Key = #13 then
  begin
    if Timer1.Enabled then
      begin
        Timer1.Enabled := false;
        Panel2.Caption := 'Got it! Press Enter to reset.';
      end
    else
      begin
        Timer1.Enabled := true;
        Panel2.Caption := 'Press Enter to lock color.';
      end;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

注意:定时器设置为每10毫秒运行一次,如果这有任何区别.

任何和所有帮助弄清楚为什么这是泄漏和使用如此多的资源将非常感谢!

如果你需要,你可以在这里找到项目(Delphi 2010):http://www.mediafire.com/file/cgltcy9c2s80f74/Color%20Picker.rar

谢谢!

OnT*_*Fly 5

你永远不会释放你的Canvas1对象,泄漏进程堆和GDI obj.处理.

  • 这看起来是正确的答案.此外,值得注意的是,您可以让Delphi告诉您泄漏的内容和位置."什么"很容易.只需设置`ReportMemoryLeaksAtShutdown:= true`即可."哪里"有点棘手.为此,您需要从SourceForge下载完整版本的FastMM4,并使用FullDebugMode获取内存泄漏的堆栈跟踪.它有关于如何使用该项目执行此操作的说明. (3认同)