Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.08.2013, 15:22
Smail Smail вне форума
Прохожий
 
Регистрация: 20.08.2011
Сообщения: 2
Версия Delphi: RAD 2010
Репутация: 10
По умолчанию Не уничтожается класс - происходит утечка памяти

Ребята создал класс который отрисовывает кубики рандомного цвета и закинул его Creat и destroy на таймер. Кубики отрисовываются как задумывалось но вот вот сам класс не уничтожается и происходит утечка памяти, проверял по диспетчеру задач,через пять отрисовок память увеличивается на 5kb. Прилагаю код ниже , подозреваю что не корректно уничтожаю объект.
Код:
unit Brick;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    img_Fon: TImage;
    tmr_1: TTimer;
    procedure tmr_1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

 type
  TBrick = class
    constructor Create (New_X_Y:TPoint;New_Fon:TCanvas;NewX_W,NewY_H:Integer;_Brush:TBrushStyle;color:Integer);
    function Color_Brick (_color_Brick_ : array  of Integer):Integer; // рандомит цвет кубика
    // New_X_Y:TPoint - верхний левый угол кубика
    // New_Fon:TCanvas - передаю параметр на каком объекте отрисовывать
    // NewX_W,NewY_H - ширина и высота кубика
    // _Brush:TBrushStyle;color:Integer - соответственно стиль и цвет заполнения кубика
  end;

var
  Form1: TForm1;
  const
   //массив цветов кубиков
  _Color_Brick : array [1..12] of Integer = (clAqua, clBlue, clFuchsia, clGreen,
  clLime, clMaroon, clNavy, clOlive, clPurple, clRed, clTeal, clYellow);

implementation

{$R *.dfm}

{ TBrick }

function TBrick.Color_Brick(_color_Brick_ :array of Integer): Integer;
begin
 Randomize;
 Result := _Color_Brick[Random(12)+1];
end;

constructor TBrick.Create(New_X_Y: TPoint; New_Fon: TCanvas;NewX_W,NewY_H:Integer;_Brush:TBrushStyle;color:Integer);
begin
New_Fon.Brush.Style := _Brush;
New_Fon.Brush.Color := color;
New_Fon.FillRect(Bounds(New_X_Y.X ,New_X_Y.Y, NewX_W, NewY_H));
end;

procedure TForm1.tmr_1Timer(Sender: TObject);
var
Brick : TBrick;
I,j,c: Integer;
x,y:Integer;
begin
y := 10 ;
x := 10 ;
Randomize;
 for i := 1 to 12 do
  begin
     c := Random(12)+1;
     for j := 0 to 10 do
     begin
     Brick := TBrick.Create(Point(x,y),img_Fon.Canvas,53,25,bsSolid,_color_Brick[c]);
     Brick.Destroy;
     x := x + 53 + 3;
     end;
    x := 10;
    y := y + 25 + 3;
  end;

end;

end.
В чем проблема подскажите пожалуста.
Ответить с цитированием
  #2  
Старый 17.08.2013, 16:19
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,029
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Вызывай Free, а не Destroy.
В остальном, вроде, нормально.
Только непонятно зачем тебе тут такой класс, если ты его создаешь и сразу уничтожаешь.
Ответить с цитированием
  #3  
Старый 17.08.2013, 16:28
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

да как бы все на месте. только рекомендуют вместо Destroy использовать Free. установи Interval таймеру в 1 и смотри что утечки нет.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #4  
Старый 20.08.2013, 12:22
vkey vkey вне форума
Прохожий
 
Регистрация: 16.08.2013
Сообщения: 5
Версия Delphi: 10 Seattle
Репутация: 10
По умолчанию

Smail !

Это спасёт великого гуру
=====================

Вместо твоей строки 71
Brick.Destroy;

поставь
FreeObject(Brick); // где Brick - твой созданный класс


И не забудь про эти процедуры

Код:
procedure FreeObject(var O);
var
  OO: TObject absolute O;
  XX: TObject;
begin
  XX := nil;
  XChg(Integer(OO), Integer(XX));
  TObject(XX).Free;
end;

procedure XChg(var Critical, Normal); assembler;
asm
  mov  ecx, [edx]
  lock xchg[eax], ecx
  mov  [edx], ecx
end;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:59.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter