Сборщик мусора
От: Khimik  
Дата: 05.05.19 07:50
Оценка:
Я уже писал в другой теме про свой кастомный сборщик мусора – класс 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.
Мне вначале говорили, что это не нужно, т.к. в Delphi есть опция ReportMemoryLeaksOnShutdown := True;

Но я убедился, что мой сборщик хорошо её дополняет. Дело в том что часто нужно создавать временный код, который лень писать по правилам, без утечек. Поэтому я включаю свой сборщик мусора только время от времени, а потом ещё включаю 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++? Я полагаю тут всё должно быть просто.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.