Хочу garbage collector ;-)

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

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

Ответить
Climber
постоялец
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Хочу garbage collector ;-)

Сообщение Climber »

Я вот давно думаю...
Строковая переменная хранит счетчик ссылок. Как только он обнуляется, строка уничтожается. То же самое вроде с записями происходит. Потомки класса Exception тоже автоматически уничтожаются...
Может, уже пора сделать garbage collector как в java и не мучаться с утечками памяти? Никто не в курсе, как с этим дела обстоят?
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

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

Сообщение Climber »

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

А данные где хранить? В записях и массивах, отдельно?
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Как только проект с интерфейсами усложняется настолько, что в нем появляются циклические ссылки, все счастье сразу куда-то девается :(
Изобретя недавно квадратноколесный велосипед с модулем DOM, я подумываю о том, чтобы портировать libgc (http://www.hpl.hp.com/personal/Hans_Boehm/gc/). Хотя, в общем-то, его можно и не портировать, а использовать просто так, в виде отдельной dll.
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

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

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

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

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

Сообщение Climber »

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

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

Тогда я ничего не понимаю в программировании. Ну, как минимум, в интерфейсах... Можно маленький пример утечки памяти и как его можно избежать с помощью интерфейсов?
Odyssey
энтузиаст
Сообщения: 580
Зарегистрирован: 29.11.2007 16:32:24

Сообщение Odyssey »

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

Код: Выделить всё

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 раз.
Climber
постоялец
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Сообщение Climber »

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

Да, спасибо, именно это и было нужно.
И за ссылку спасибо. Кстати, я думал, что Garbage Collector в java работает так же, как подсчет ссылок в Delphi...
Ranma
незнакомец
Сообщения: 4
Зарегистрирован: 11.03.2009 09:53:08

Сообщение Ranma »

//сорри, не туда написал, удалил
Ответить