[программирование] Сборщик мусора для Delphi и C/C++

здесь можно обсудить кошечек и ёжиков
Ответить
Аватара пользователя
Vit Nhoc
Сообщения: 1369
Зарегистрирован: Сб июн 06, 2015 12:28 pm

[программирование] Сборщик мусора для Delphi и C/C++

Сообщение Vit Nhoc » Вс июн 02, 2019 8:08 am

Здравствуйте, извиняюсь что немного дублирую тему.
Я уже писал про свой сборщик мусора в Delphi – класс TSafeObject и объект ProjectGarbageFinder в Delphi. Они выглядят примерно так:

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

TSafeObject=class
  public
    constructor Create;
    destructor Destroy; override;
    procedure SetThisObjectAsDebugging;//Не будет выводиться сообщение об ошибке
  end;

constructor TSafeObject.Create;
  begin
    inherited;
    if poGarbageFinderActive then begin
      ProjectGarbageFinder.ObjectCreated(self);
    end;
  end;

destructor TSafeObject.Destroy;
  begin
    if poGarbageFinderActive then begin
      ProjectGarbageFinder.ObjectDestroyed(self);
    end;
  inherited;
end;
Все мои классы теперь наследники TSafeObject. Когда класс создаётся, конструктор вызывает функцию ProjectGarbageFinder.ObjectCreated, и объект ProjectGarbageFinder запоминает адрес экземпляра класса в массиве. Когда класс уничтожается – ProjectGarbageFinder находит его в этом массиве и удаляет оттуда. При завершении работы программы (или ещё раньше, если нужно) ProjectGarbageFinder пишет в текстовом файле список классов, которые остались не уничтоженными.

Мне вначале говорили, что это не нужно, т.к. в Delphi есть опция ReportMemoryLeaksOnShutdown := True;

Но я убедился, что мой сборщик хорошо её дополняет, поскольку с ним можно подкрутить много надстроек, облегчающих отлов багов. Лучше всего было бы проанализировать стек на вызове TSafeObject.Create и разобраться, из какого участка кода эта функция была вызвана; но это я пока не осилил. И всё равно мой сборщик хорошо работает, поскольку пишет в отчёте разную вспомогательную информацию (скажем, время когда был вызван конструктор проблемного объекта).
Вначале я также думал, что можно включить ReportMemoryLeaksOnShutdown на постоянной основе и так и писать код, отлавливая утечки в зародыше. Но это, по-моему, тоже достаточно неудобно, по крайней мере для меня. Дело в том что часто нужно создавать временный код, который лень писать по правилам, без утечек. Так что я включаю свой сборщик мусора только время от времени, а в финале ещё включаю ReportMemoryLeaksOnShutdown – эта опция ловит оставшиеся утечки вроде неудалённых стандартных динамических массивов.

Также я почти отказался от обычных динамических массивов в Delphi, заменив их на такие штуки:

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

TRiAnySimpleArray<MyType> = record
  public
    FCount:integer;
    FItems:tarray<mytype>;
    procedure SetCount(newcount:integer); inline;
    function GetItem(Index:Integer): MyType; inline;
    procedure SetItem(Index:integer; value:mytype); inline;
    property Item[index: integer]: MyType read getItem write setItem; default;
    property Count:integer read FCount write SetCount;
    procedure InitAndSetCount(newcount:integer);
    procedure Initialize;
    procedure Finalize;
  end;
Эти динамические массивы тоже взаимодействуют с моим сборщиком мусора:

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

procedure TRiAnySimpleArray<MyType>.SetCount(newcount: integer);
  begin
    if poGarbageFinderActive then begin
      if fcount>0 then ProjecTGarbageFinder.MemoryBlockDestroyed(addr(fitems[0]));
    end;

  setlength(fitems,newcount);
  fcount:=newcount;

  if poGarbageFinderActive then begin
    if newcount>0 then ProjecTGarbageFinder.MemoryBlockCreated(addr(fitems[0]),newcount);
  end;

end;
И вот у меня вопрос к сишникам – как всё это реализовать на C или C++? Я полагаю, тут всё должно быть очень просто.
"Ты должен сделать добро из зла, потому что больше его сделать не из чего". АБ Стругацкие.

kbob
Сообщения: 1987
Зарегистрирован: Сб окт 17, 2009 9:48 am

Re: [программирование] Сборщик мусора для Delphi и C/C++

Сообщение kbob » Вс июн 02, 2019 9:44 am

Vit Nhoc писал(а):
Вс июн 02, 2019 8:08 am
Здравствуйте, извиняюсь что немного дублирую тему.
Я уже писал про свой сборщик мусора в Delphi...

И вот у меня вопрос к сишникам – как всё это реализовать на C или C++? Я полагаю, тут всё должно быть очень просто.
Все просто - в С/С++ нет сборщика мусора, но велосипедостроение не запрещено https://habr.com/ru/post/282544/
If you are not part of the solution, you are part of the precipitate.

IDEApro
Сообщения: 2
Зарегистрирован: Вт июн 04, 2019 7:49 pm

Re: [программирование] Сборщик мусора для Delphi и C/C++

Сообщение IDEApro » Вт июн 04, 2019 7:52 pm

Какой редактор кода посоветуете? Что лучше Atom Editor или Sublime Text 3 ? Или знаете что то другое и получше
Желательно объективное мнение... :235:
Кто чем пользуеться?
Последний раз редактировалось IDEApro Ср июн 05, 2019 5:00 pm, всего редактировалось 2 раза.

Sartorius84
Сообщения: 1160
Зарегистрирован: Ср фев 26, 2014 11:22 am

Re: [программирование] Сборщик мусора для Delphi и C/C++

Сообщение Sartorius84 » Вт июн 04, 2019 10:33 pm

Vit Nhoc, на С++ это можно реализовать, переписав с испольозванием синтаксиса C++ :) Ничего специфического из delphi Вы не используете.
Или перегрузить new/delete, что может быть удобнее наследования: https://habr.com/en/post/282544/

И это все-таки не сборщик мусора, а просто инструментирование классов для отладки. Сборщик мусора сам уничтожает объекты, когда это необходимо.

IDEApro писал(а):
Вт июн 04, 2019 7:52 pm
Какой редактор кода посоветуете? Что лучше Atom Editor или Sublime Text? Или знаете что то другое и получше
Желательно объективное мнение... :235:
Кто чем пользуеться?
Каой-то оффтопик у Вас. Но все же отвечу : в качестве универсального редактора обычно пользуюсь Sublime Text 3. Многие в последнее время агитируют переходить на VSCode, присматриваюсь к нему... Атом пробовал давно и он мне не понравился, сейчас уже даже не помню почему.

IDEApro
Сообщения: 2
Зарегистрирован: Вт июн 04, 2019 7:49 pm

Re: [программирование] Сборщик мусора для Delphi и C/C++

Сообщение IDEApro » Ср июн 05, 2019 1:07 am

Sartorius84 писал(а):
Вт июн 04, 2019 10:33 pm
Каой-то оффтопик у Вас. Но все же отвечу : в качестве универсального редактора обычно пользуюсь Sublime Text 3. Многие в последнее время агитируют переходить на VSCode, присматриваюсь к нему... Атом пробовал давно и он мне не понравился, сейчас уже даже не помню почему.
Visual Studio Code слышал о нем, они сейчас интересные эксперименты с интерфейсом делают
Видел на скриншотах что после декабрьского обновления, там вроде как появился полупрозрачный бэкграунд, что даже рабочий стол видно
Но работает ли оно так? Или это только для презентации сделали?

Но все же саблайм меня покоряет количеством плагинов, а также удобными горячими клавишами
Еще раз извините за оффтоп, не нашел другой подходящей темы

Ответить

Вернуться в «лицом к лицу»

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

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