VadimLou Цитата: нужно избегать зависших ссылок при взаимных ссылках объектов
То что касается OLE технологий это как раз часто возникающие проблемы зависших ссылок. Тут я плюсов не вообще не замечаю.
1) У обычного программиста при использовании нового не до конца проверенного кода бывают мизерные утечки памяти. Грех о них говорить - db.close; exitprocess(0); и система в 10 раз быстрее вполне корректно закроет приложение и освободит память. Пользы от гарбаджа ровно ноль.
2) В С# для того чтобы было меньше проблем у программистов, чтобы не было так грустно есть оператор using. Вот он бы не помешал и без коллектора, однако бегать перед паровозом любимое занятие.
3)
Цитата: Для винды всё старое останется, так что спите спокойно ...
Вот я то другое понял, они рассматривают путь промежуточного компилятора и я то понял что это должно коснуться win32-64. Дай то бог если не так, но если они угробят OLE, то мне этот компилятор будет бесполезен.
4) with - deprecated. Я предлагаю сделать begin end - deprecated, чтобы юзерам сразу было ясно, почему их fmx прога не компилится.
5)
Цитата: Зато и плюсов видно много.
Мне не видно ниодного. Мемори лики в лёгкую фиксю начиная с 2004 года и не вижу проблем. В моих программах с 2004 года ГК бесполезен абсолютно. Для чистки мемориликов у меня собственный модуль, который иногда пишу с нуля - не всегда под рукой а пишется за 20 минут.
[more=Аля это]
Код: [no]unit FixMemLk;
interface
implementation
var
Ptr: packed array[0..300000] of
packed record
P: Pointer;
Sz: Integer;
Sp: Pointer;
end;
LastFree: Integer = 0;
var
OldMemMgrEx: TMemoryManagerEx;
NewMemMgrEx: TMemoryManagerEx;
function IndexOfP(P: Pointer): Integer;
var
I: Integer;
begin
for I := 0 to LastFree - 1 do
if Ptr[I].P = P then
begin
Result := I;
Exit;
end;
Result := -1;
end;
function MyGetMem(Size: Integer): Pointer;
var
sp: Pointer;
begin
sp := @sp;
Result := OldMemMgrEx.GetMem(Size);
Ptr[LastFree].P := Result;
Ptr[LastFree].Sz := Size;
Ptr[LastFree].Sp := sp;
Inc(LastFree);
{ - а тут брейкпоинт ставлю и всё if (Size=172)and(Integer(sp)=$12DDF4) then
Assert(false,'Error Message');}
end;
function MyFreeMem(P: Pointer): Integer;
var
I: Integer;
begin
Result := OldMemMgrEx.FreeMem(P);
I := IndexOfP(P);
Assert(I>=0,'Error Message');
Move(Ptr[I+1].P,Ptr[I].P,Sizeof(Ptr[0])*(LastFree-I));
Dec(LastFree);
end;
function MyReallocMem(P: Pointer; Size: Integer): Pointer;
var
I: Integer;
begin
Result := OldMemMgrEx.ReallocMem(P, Size);
I := IndexOfP(P);
Assert(I>=0,'Error Message');
Ptr[I].P := Result;
Ptr[I].Sz := Size;
end;
function MyAllocMem(Size: Cardinal): Pointer;
var
sp: Pointer;
begin
sp := @sp;
Result := OldMemMgrEx.GetMem(Size);
Ptr[LastFree].P := Result;
Ptr[LastFree].Sz := Size;
Ptr[LastFree].Sp := sp;
Inc(LastFree);
end;
initialization
FillChar(Ptr, Sizeof(Ptr), 0);
GetMemoryManager(OldMemMgrEx);
NewMemMgrEx := OldMemMgrEx;
NewMemMgrEx.GetMem := MyGetMem;
NewMemMgrEx.FreeMem := MyFreeMem;
NewMemMgrEx.ReallocMem := MyReallocMem;
NewMemMgrEx.AllocMem := MyAllocMem;
SetMemoryManager(NewMemMgrEx);
finalization
SetMemoryManager(OldMemMgrEx);
end.[/no]