Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.04.2008, 10:51   #1
nimf
Пользователь
 
Регистрация: 29.08.2007
Сообщений: 51
Лампочка Создание/уничтожение объектов

Товарищи специалисты, подскажите пожалуйста. Как мне отслеживать какие объекты созданные динамически я не удаляю. Может существует какая нибудь прога позволяющая этоотслеживать
nimf вне форума Ответить с цитированием
Старый 11.04.2008, 10:56   #2
Ins
Форумчанин
 
Регистрация: 29.12.2007
Сообщений: 137
По умолчанию

Поиск в гугле по слову MemProof
Ins вне форума Ответить с цитированием
Старый 11.04.2008, 19:14   #3
SKYDOS
Программер
 
Аватар для SKYDOS
 
Регистрация: 11.04.2008
Сообщений: 6
По умолчанию

просто используй код после того, как использованная кнопка тебе не нужна...
ну что-то вроде этого...
Button1.Free;
или
Button1.Destroy;
ну вот)
Программеры ЛУЧШЕ ВСЕХ!!
SKYDOS вне форума Ответить с цитированием
Старый 11.04.2008, 19:52   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Как мне отслеживать какие объекты созданные динамически я не удаляю. Может существует какая нибудь прога позволяющая это отслеживать
Предложение такое.
Кидаете на форму ListBox и при создании объекта заносите туда новой строкой имя созданного объекта, а при уничтожении его - ищете соответствующую строку и удаляете ее.
При выходе их программы проверяете количество строк в ListBox-е и, если оно больше нуля, выводите либо предупреждение, либо сам список ListBox.
Я так понимаю, вам это нужно для проверки своего кода на завершенность и с целью предотвращения утечки ресурсов?
mihali4 вне форума Ответить с цитированием
Старый 11.04.2008, 23:11   #5
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

А какие объекты обязательно, и какие необязательно удалять.
Глобальные понятно не обязательно, а вот функции, например такая
Код:
function DoSmth: TBitmap;
begin
Result:=TBitmap.Create;
//и так далее
end;
Утечки не будет с ней?
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 11.04.2008, 23:45   #6
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от mutabor Посмотреть сообщение
Утечки не будет с ней?
стараюсь придерживаться простого правила - объекты удаляются там-же, где и создаются:

Код:
B:=TBitMap.Create;
try
 ...
finally
   B.free;
end;
Если это невозможно из-за длительного времени жизни, то создание и удаление должно выполняться одним владельцем. Например для объектов, соответственно в констракторе и дестракторе.

Распределение памяти и возврат функциями указателей лучше не допускать. В этом случае, особенно, если функция будет использоваться неоднократно, непонятно создает она этот объект или возвращает ссылку на ранее созданный. И нужно ли его освободить после использования.

Безопасней создать отдельный класс. (В терминах шаблонов - фабрику объектов). У этого класса будет метод doSmth, который вернет TBitMap, но владельцем останется фабрика и он будет уничтожен при уничтожении фабрики. Т.е. принцип останется:

Код:
F := TFabric.Create;
try
  B := F.doSmth;
  ... 
  // B не уничтожаем, т.к. он принадлежит фабрике
finally
   F.free;
end;
Или можно сделать метод для обработки уже существующего объекта. Таким образом создание и уничтожение объекта отдается тому, кто будет использовать этот метод

Код:
procedure doSmth(B:TBitMap);
begin
 ...
end;
alexBlack вне форума Ответить с цитированием
Старый 12.04.2008, 23:52   #7
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
Распределение памяти и возврат функциями указателей лучше не допускать. В этом случае, особенно, если функция будет использоваться неоднократно, непонятно создает она этот объект или возвращает ссылку на ранее созданный. И нужно ли его освободить после использования.
Так какой же окончательный ответ? Можно конечно на практике проверить, но интересно в теории, я так понял из вашего ответа что будет утечка?
Из-за этих сомнений я обычно и использую процедуры с передачей в них объекта "со стороны".
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 13.04.2008, 09:01   #8
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Если так:

Код:
B := doSmth;
...
B.Free
то, конечно утечки не будет. Я это к тому, что посмотрев на этот код нужно обязательно посмотреть на код в посте #5. То есть неочевидно, что требуется B.Free, а значит о нем можно забыть.

Цитата:
Так какой же окончательный ответ?
Сам возврат указателя не приводит к утечке памяти. Проблема потенциальная.

Компилятор реализует вызов B := doSmth как передачу var-параметра - doSmth(var B).
Это можно увидеть на примере вот-такого кода. Как думаете, что появится на форме ?:

Код:
function doSmth : AnsiString;
begin
   result := result + 'xxx';
end;

procedure TForm1.FormCreate(Sender: TObject);
var S:AnsiString;
begin
   S := 'test ';
   S := doSmth;
   label1.Caption := S;
end;
Цитата:
Из-за этих сомнений я обычно и использую процедуры с передачей в них объекта "со стороны".
И правильно.

Последний раз редактировалось alexBlack; 13.04.2008 в 09:17.
alexBlack вне форума Ответить с цитированием
Старый 13.04.2008, 09:33   #9
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
Как думаете, что появится на форме ?:
Думал это 'xxx'... а появилось 'test xxx'
з.ы. Пошел заполнять пробелы в матчасти =)
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 13.04.2008 в 09:39.
mutabor вне форума Ответить с цитированием
Старый 13.04.2008, 09:46   #10
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Этот код эквивалентен такому вызову:

Код:
procedure doSmth(var result: AnsiString);   
begin  
   result := result + 'xxx';   
end;   
  
procedure TForm1.FormCreate(Sender: TObject);   
var S:AnsiString;   
begin  
   S := 'test ';   
   doSmth(S);   
   label1.Caption := S;   
end;
Для простых типов это не проходит, т.к. компилятор делает инициализацию result. Для AnsiString инициализации не делается. Отсюда такой эффект. Пример, конечно, надуманный.
alexBlack вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Автоматическое уничтожение объекта mutabor Общие вопросы Delphi 6 25.06.2008 22:25
Уничтожение окна Kashp Win Api 20 07.09.2007 14:15
Динамическое создание объектов LepihinMS Общие вопросы Delphi 18 05.07.2007 23:31
Создание новых объектов Washington Общие вопросы Delphi 1 10.03.2007 21:57