Сомневаюсь что на этапе компиляции можно отследить динамически регистрируемые и динамически создаваемые сущности, такие ошибки обычно очень нетривиальны.
А Form1:=TForm.create сделал, но Form1.free забыл - это и не ошибка имхо, так, опечатка
Модератор: Модераторы
Сомневаюсь что на этапе компиляции можно отследить динамически регистрируемые и динамически создаваемые сущности
А Form1:=TForm.create сделал, но Form1.free забыл - это и не ошибка имхо, так, опечатка
вы прям умные показатели панацеей считаете. Строки в паскале давным давно умные, а утекшие динамически созданные строки у меня например - обычное дело
zub писал(а):Пожалуй я сольюсь из спора.появится нормальная возможность реализации хитрых указателей - посмотрим
type
generic TAutoShared<T: class> = record
private
type
{$push}{$interfaces com}
IOwner = interface
function GetInstance: T;
end;
{$pop}
TOwner = class(TInterfacedObject, IOwner)
protected
FInstance: T;
function GetInstance: T;
public
constructor Create;
constructor Create(aInst: T);
destructor Destroy; override;
end;
var
FOwner: IOwner;
function GetInstance: T; inline;
procedure SetInstance(aValue: T); inline;
public
class operator :=(var s: TAutoShared): T; inline;
class operator Explicit(var s: TAutoShared): T; inline;
procedure Release; inline;
property Instance: T read GetInstance write SetInstance;
end;
implementation
{ TAutoShared.THolder }
function TAutoShared.TOwner.GetInstance: T;
begin
Result := FInstance;
end;
constructor TAutoShared.TOwner.Create;
begin
FInstance := T.Create;
end;
constructor TAutoShared.TOwner.Create(aInst: T);
begin
FInstance := aInst;
end;
destructor TAutoShared.TOwner.Destroy;
begin
FInstance.Free;
inherited;
end;
{ TAutoShared }
function TAutoShared.GetInstance: T;
begin
if FOwner = nil then
FOwner := TOwner.Create;
Result := FOwner.GetInstance;
end;
procedure TAutoShared.SetInstance(aValue: T);
begin
if aValue <> Default(T) then
begin
if (FOwner <> nil) and (aValue = FOwner.GetInstance) then exit;
FOwner := TOwner.Create(aValue)
end
else
FOwner := nil;
end;
class operator TAutoShared.:=(var s: TAutoShared): T;
begin
Result := s.Instance;
end;
class operator TAutoShared.Explicit(var s: TAutoShared): T;
begin
Result := s.Instance;
end;
procedure TAutoShared.Release;
begin
FOwner := nil;
end;
Mikhail писал(а):Проблема даже не в том что нужно переделать компилятор, а в том что нужно еще все библиотеки и существующий на Паскале софт переделать.
zub писал(а):Интерфейсы
sts писал(а):Без этого нет смысла в развитии языка, вон добавили дженерики и что? где TComboBox<TMyObject>.Items<T> (или как там)?.
имею ввиду служебную инфу по отрицательному смещению и возможность использовать как указатель непосредственно на данные
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 28