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