Хочу garbage collector ;-)

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Хочу garbage collector ;-)

Сообщение Climber » 11.07.2009 21:37:56

Я вот давно думаю...
Строковая переменная хранит счетчик ссылок. Как только он обнуляется, строка уничтожается. То же самое вроде с записями происходит. Потомки класса Exception тоже автоматически уничтожаются...
Может, уже пора сделать garbage collector как в java и не мучаться с утечками памяти? Никто не в курсе, как с этим дела обстоят?
Climber
постоялец
 
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Re: Хочу garbage collector ;-)

Сообщение Иван Шихалев » 11.07.2009 22:30:23

Пользуйтесь интерфейсами и будет вам счастье.
// С записями ничего не происходит. Автоуправляются строки и динамические массивы.
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Re: Хочу garbage collector ;-)

Сообщение Climber » 12.07.2009 00:40:49

Иван Шихалев писал(а):Пользуйтесь интерфейсами и будет вам счастье.

А данные где хранить? В записях и массивах, отдельно?
Climber
постоялец
 
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Re: Хочу garbage collector ;-)

Сообщение Sergei I. Gorelkin » 12.07.2009 01:54:40

Как только проект с интерфейсами усложняется настолько, что в нем появляются циклические ссылки, все счастье сразу куда-то девается :(
Изобретя недавно квадратноколесный велосипед с модулем DOM, я подумываю о том, чтобы портировать libgc (http://www.hpl.hp.com/personal/Hans_Boehm/gc/). Хотя, в общем-то, его можно и не портировать, а использовать просто так, в виде отдельной dll.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Хочу garbage collector ;-)

Сообщение Иван Шихалев » 12.07.2009 08:30:51

Climber писал(а):А данные где хранить? В записях и массивах, отдельно?

Зачем отдельно? В объектах и хранить.

Sergei I. Gorelkin писал(а):Как только проект с интерфейсами усложняется настолько, что в нем появляются циклические ссылки, все счастье сразу куда-то девается

Ну... Не то, чтобы все. Но в целом согласен. Очень нехватает чего-то вроде специального типа, чтобы все как в интерфейсном (включая контроль наследования и пр.), но не отрабатывало б на счетчиках... Приходится держать переменные в Pointer'ах...
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Re: Хочу garbage collector ;-)

Сообщение Climber » 12.07.2009 10:35:25

Иван Шихалев писал(а):
Climber писал(а):А данные где хранить? В записях и массивах, отдельно?

Зачем отдельно? В объектах и хранить.

Тогда я ничего не понимаю в программировании. Ну, как минимум, в интерфейсах... Можно маленький пример утечки памяти и как его можно избежать с помощью интерфейсов?
Climber
постоялец
 
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Re: Хочу garbage collector ;-)

Сообщение Odyssey » 08.08.2009 20:11:35

Если, спустя месяц, это все же кому-то нужно - то пример.
Если сделать так:
Код: Выделить всё
type
  TSomeObject = class
    procedure DoSomething;
  end;
var
  SomeObject: TSomeObject;
begin
  SomeObject := TSomeObject.Create;
  SomeObject.DoSomething;
end.

Будет утечка памяти, потому что не вызван SomeObject.Free.

Если же сделать так:
Код: Выделить всё
type
  ISomeObject = interface
    procedure DoSomething; // реализация не нужна
  end;

  TSomeObject = class(TInterfacedObject, ISomeObject)
    procedure DoSomething; // реализация нужна
  end;

var
  SomeObject: ISomeObject;
begin
  SomeObject := TSomeObject.Create;
  SomeObject.DoSomething;
end.

То утечки не будет, потому что SomeObject - интерфейсная переменная, ссылки на нее считаются автоматически и как только последняя ссылка (т.е. сама SomeObject) выйдет из зоны видимости (т.е. выполнение уйдет за end), TSomeObject.Free будет вызван автоматически.

Управление памятью на интерфейсах подробнее описано например тут:
http://softwaremaniacs.org/blog/2005/05 ... anagement/

А вообще, имхо, для устранений утечек лучше использовать heaptrc, чем управление памятью на интерфейсах.
Последний раз редактировалось Odyssey 10.08.2009 19:55:24, всего редактировалось 1 раз.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: Хочу garbage collector ;-)

Сообщение Climber » 10.08.2009 16:39:14

Odyssey писал(а):Если, спустя месяц, это все же кому-то нужно - то пример.

Да, спасибо, именно это и было нужно.
И за ссылку спасибо. Кстати, я думал, что Garbage Collector в java работает так же, как подсчет ссылок в Delphi...
Climber
постоялец
 
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Сообщение Ranma » 11.08.2009 15:49:03

//сорри, не туда написал, удалил
Ranma
незнакомец
 
Сообщения: 4
Зарегистрирован: 11.03.2009 10:53:08


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru
cron