Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Delphi -- утечка памяти на ровном месте

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
kulakovboris



Зарегистрирован: 05.12.2011
Сообщения: 1

СообщениеДобавлено: Пн Дек 05 2011 08:22    Заголовок сообщения: Delphi -- утечка памяти на ровном месте Ответить с цитатой

Для удобства разработки сделал новый класс, являющийся наследником предыдующего. Только метод Create у него немного не такой, а немного переделанный. Это было сделано с целью повышения наглядности программного кода.

Но вот только стали происходить УТЕЧКИ ПАМЯТИ. Долго копался, в чём причина, потом упростил всё буквально до Create-Free, утечка всё равно присутствует.

Вот листинг (здесь всё сильно упрощено, оставлено минимально необходимое для понимания ситуации):

UNIT Unit1;
INTERFACE
USES
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
public
end;
TThread2=class(TThread)
constructor Create(p: TThreadPriority);
end;
var
Form1: TForm1;

IMPLEMENTATION
{$R *.dfm}

constructor TThread2.Create(p: TThreadPriority);
begin
TThread(self):=TThread.Create(true);
self.Priority:=p;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
memory0, memory: integer;
p: pointer;
T: TThread; T2: TThread2;
i: integer;
begin
memory0:=GetHeapStatus.TotalAllocated;
for i:=1 to 1000 do begin
T:=TThread.Create(true);
T.Free;
end;
memory:=GetHeapStatus.TotalAllocated;
ShowMessage('Memory consumption: '+inttostr(memory-memory0));
end;

procedure TForm1.Button2Click(Sender: TObject);
var
memory0, memory: integer;
p: pointer;
T: TThread; T2: TThread2;
i: integer;
begin
memory0:=GetHeapStatus.TotalAllocated;
for i:=1 to 1000 do begin
T2:=TThread2.Create(tpLower);
T2.Free;
end;
memory:=GetHeapStatus.TotalAllocated;
ShowMessage('Memory consumption: '+inttostr(memory-memory0));
end;

END.

При Button1.Click потребление памяти составляет 0 байт, при Button2.Click -- 64000 байт. А собственно, почему? Вроде всё корректно должно освобождаться...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
and3008



Зарегистрирован: 12.10.2001
Сообщения: 14893
Откуда: Н.Новгород

СообщениеДобавлено: Вт Дек 06 2011 20:40    Заголовок сообщения: Ответить с цитатой

Угу... Мудро... Создать в классе другой объект и наивно надеяться, что при Free от класса, удаляться и все то, что ты там сам насоздавал....

В UNIX такое называется "зомби-процесс". Т.е. когда нет хозяина, а дети им порожденные бродят по ОС и память занимают.

В общем если в Create что-то создаешь, то будь добр во Free объекты тобой созданные так же по-килять.

Надеюсь понятно изложил?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...