Сборщик мусора
От: 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...
Пока на собственное сообщение не было ответов, его можно удалить.