С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
Orakul
2 / 2 / 0
Регистрация: 07.07.2012
Сообщений: 127
1

Утечка памяти в программе , как избежать или как правильно уничтожить объект?

17.08.2013, 15:47. Просмотров 2068. Ответов 24
Метки нет (Все метки)

Ребят помогите создал класс , вызываю его Creat после destroy ,проект работает только вот память используемая потихоньку растет через пять отрисовок на 5 кб. Грешу что не корректно уничтожаю объект. Код прилагается

подскажите в чем проблема?
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
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.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.08.2013, 15:47
Ответы с готовыми решениями:

Как уничтожить объект созданный CreateOleObject
Как уничтожить объект созданный CreateOleObject

Утечка памяти в простейшей функции. Как исправить?
Простейший пример: function func(a : string;):TStringList; var i:integer;...

Утечка памяти или куда пропало =)
Люди всем привет :) Почему у меня после выполнения кода в a = '' ?, когда a =...

Нахождение "утечки" памяти или как правильно почистить мусор
Добрый день Гуру. Win 8.1, DX 10.2 32 bit. Стандартный набор фраз: новичок,...

Утечка, или как оптимизировать программу?
Есть небольшая программа для определения активного окна юзера и внесения в базу...

24
саша40
-111 / 293 / 47
Регистрация: 14.08.2012
Сообщений: 2,573
17.08.2013, 16:30 2
для уничтожения объекта(вашего класса) надо применять deconstructor. Оно очистит память от объекта. Можно и прописать ещё Object:=nil;
0
droider
17.08.2013, 16:34
  #3

Не по теме:

Цитата Сообщение от саша40 Посмотреть сообщение
надо применять deconstructor
круто. Ты сам понял, что написал?

0
Orakul
2 / 2 / 0
Регистрация: 07.07.2012
Сообщений: 127
17.08.2013, 16:40  [ТС] 4
саша40, это как использовать Deconstructor приведи пример

Добавлено через 3 минуты
вот эти примеры тоже не уничтожают объект
Pascal
1
2
3
     Brick.Destroy;
     Brick := nil;
     Brick.Free;
0
саша40
-111 / 293 / 47
Регистрация: 14.08.2012
Сообщений: 2,573
17.08.2013, 18:01 5
прописываете:
Delphi
1
deconstructor Free();
и немного описываете. процедуру. Потом уже в программе вызываете её.
0
Orakul
2 / 2 / 0
Регистрация: 07.07.2012
Сообщений: 127
17.08.2013, 18:04  [ТС] 6
саша40,


deconstructor такой функции делфи не знает
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26541 / 17827 / 7051
Регистрация: 22.10.2011
Сообщений: 31,371
Записей в блоге: 6
17.08.2013, 18:05 7
Orakul, Destroy руками не вызывается. Никогда. Вызывается Free, безо всяких предварительных действий. Или FreeAndNil.

Цитата Сообщение от Orakul Посмотреть сообщение
deconstructor такой функции делфи не знает
Не обращай внимания. Это местная достопримечательность. Всё, что он пишет, можно смело пропускать, не читая...
0
Orakul
2 / 2 / 0
Регистрация: 07.07.2012
Сообщений: 127
17.08.2013, 18:09  [ТС] 8
UI, на FreeAndNil делфи ругается а метод Free не уничтожает объект - сужу по растущей памяти в диспетчере задач
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26541 / 17827 / 7051
Регистрация: 22.10.2011
Сообщений: 31,371
Записей в блоге: 6
17.08.2013, 18:11 9
Цитата Сообщение от Orakul Посмотреть сообщение
на FreeAndNil делфи ругается
Не верю. Показывай, как пытался вызвать.
Цитата Сообщение от Orakul Посмотреть сообщение
сужу по растущей памяти в диспетчере задач
Ну да, ну да... Тысячу раз говорено: не используйте для этого TaskManager, не отражает он реальной картины. Нет, будут грызть любимый кактус и дальше...
0
Orakul
2 / 2 / 0
Регистрация: 07.07.2012
Сообщений: 127
17.08.2013, 18:13  [ТС] 10
UI, Brick.Free;
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26541 / 17827 / 7051
Регистрация: 22.10.2011
Сообщений: 31,371
Записей в блоге: 6
17.08.2013, 18:14 11
Я вижу что Free. Кто-то, кажется, выше утверждал, что
Цитата Сообщение от Orakul Посмотреть сообщение
на FreeAndNil делфи ругается
, или это только мне показалось?
1
Orakul
2 / 2 / 0
Регистрация: 07.07.2012
Сообщений: 127
17.08.2013, 19:05  [ТС] 12
UI, Brick.Free; Brick := nil ; так делфи не ругается все компилируется но taskmgr показывает как используемая процессом память растет. А вот если так Brick.FreeAndNil ; то делфи ругнется .
0
саша40
-111 / 293 / 47
Регистрация: 14.08.2012
Сообщений: 2,573
17.08.2013, 19:10 13
Цитата Сообщение от Orakul Посмотреть сообщение
саша40,


deconstructor такой функции делфи не знает
deconstructor это не функция! Это ключевое слово. Оно ставится перед описанием твоей FREE для объекта.

Добавлено через 1 минуту
Цитата Сообщение от UI Посмотреть сообщение
Я вижу что Free. Кто-то, кажется, выше утверждал, что , или это только мне показалось?
А может у него на всё Delphi ругается? Бывают такая школота, что даже вникнуть в свой вопрос не могут...
0
northener
пофигист широкого профиля
3429 / 2328 / 631
Регистрация: 15.07.2013
Сообщений: 13,796
17.08.2013, 19:33 14
Цитата Сообщение от саша40 Посмотреть сообщение
deconstructor это не функция! Это ключевое слово. Оно ставится перед описанием твоей FREE для объекта.
Дааа. А почему никто об этом до сих пор ничего не слышал?
0
droider
Universal
Эксперт Pascal/Delphi
4405 / 2451 / 765
Регистрация: 04.10.2012
Сообщений: 8,911
17.08.2013, 19:38 15
саша40, ты хотя бы перечитал бы то, что пишешь.

Не по теме:

весело на форуме...

0
Новичок
18.08.2013, 12:52
  #16

Не по теме:

Deconstructor,это ж надо такое!:D

0
саша40
-111 / 293 / 47
Регистрация: 14.08.2012
Сообщений: 2,573
18.08.2013, 13:41 17
Ай, destructor! Надо же было так запутатся.
0
Одиночка
3933 / 1858 / 337
Регистрация: 16.03.2012
Сообщений: 3,869
18.08.2013, 14:48 18
Orakul, FreeAndNil это процедура и вызывается так:
Delphi
1
FreeAndNil(Brick);
А наращивание памяти может происходит из-за того, что не успевает выйти из одного события таймера - наступает другое. А так по коду вроде всё правильно. Попробуй запрещать событие таймера при входе в него и разрешать на выходе.
Delphi
1
2
tmr_1.Enabled:=False;
tmr_1.Enabled:=True;
Или читай сообщение от UI: http://www.cyberforum.ru/post4958681.html
2
Orakul
2 / 2 / 0
Регистрация: 07.07.2012
Сообщений: 127
18.08.2013, 15:51  [ТС] 19
Одиночка, спасибо помогло
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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
     tmr_1.Enabled := False;
     Brick := TBrick.Create(Point(x,y),img_Fon.Canvas,53,23,bsSolid,_color_Brick[c]);
     FreeAndNil(Brick);
     x := x + 53 + 10;
     tmr_1.Enabled := True;
     end;
    x := 10;
    y := y + 25 + 5;
  end;
end;
мониторил через прогу Русиновича , доходит память до 14250 бит и происходит сброс до 14 000 бит
0
Одиночка
3933 / 1858 / 337
Регистрация: 16.03.2012
Сообщений: 3,869
18.08.2013, 15:53 20
Да нет. Нужно так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
procedure TForm1.tmr_1Timer(Sender: TObject);
var
Brick : TBrick;
I,j,c: Integer;
x,y:Integer;
begin
tmr_1.Enabled := False;
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,23,bsSolid,_color_Brick[c]);
     FreeAndNil(Brick);
     x := x + 53 + 10;
     end;
    x := 10;
    y := y + 25 + 5;
  end;
tmr_1.Enabled := True;
end;
0
18.08.2013, 15:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.08.2013, 15:53

Как правильно засунуть поток в объект?
Всем привет... проблема такая Есть у меня наследник от TThread все хорошо...

Как правильно реализовать ошибку в программе
Вот код суммы эл-тов>10 динамического массива который находится в stringgrid ...

Как сделать ограничение на перемещение? Или я не знаю как называется это правильно. (См. внутри)
Если нажимать на кнопки ВПРАВО ВЛЕВО ВВЕРХ ВНИЗ робот Петька перемещается...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru