Расшаренные ссылки на объекты
Модератор: Модераторы
Сомневаюсь что на этапе компиляции можно отследить динамически регистрируемые и динамически создаваемые сущности, такие ошибки обычно очень нетривиальны.
А Form1:=TForm.create сделал, но Form1.free забыл - это и не ошибка имхо, так, опечатка
А Form1:=TForm.create сделал, но Form1.free забыл - это и не ошибка имхо, так, опечатка
Сомневаюсь что на этапе компиляции можно отследить динамически регистрируемые и динамически создаваемые сущности
Динамически создаваемые сущности компилятор может отследить при помощи умных указателей. Программисту нужно правильно выбрать тип умного указателя, соответствующий тому, как он дальше будет использоваться.
А Form1:=TForm.create сделал, но Form1.free забыл - это и не ошибка имхо, так, опечатка
Так это же аргумент в пользу того, что отлавливать такое -- работа компилятора, а не высококвалифицированного программиста :)
>>Так это же аргумент в пользу того, что отлавливать такое -- работа компилятора, а не высококвалифицированного программиста 
из пушки по воробьям
вы прям умные показатели панацеей считаете. Строки в паскале давным давно умные, а утекшие динамически созданные строки у меня например - обычное дело
Добавлено спустя 2 минуты 28 секунд:
зы. ниче не имею против новых фич в компиляторе - лишь бы они старому не мешали
из пушки по воробьям
вы прям умные показатели панацеей считаете. Строки в паскале давным давно умные, а утекшие динамически созданные строки у меня например - обычное дело
Добавлено спустя 2 минуты 28 секунд:
зы. ниче не имею против новых фич в компиляторе - лишь бы они старому не мешали
вы прям умные показатели панацеей считаете. Строки в паскале давным давно умные, а утекшие динамически созданные строки у меня например - обычное дело
Утечек было бы столько же, если бы вы не использовали паскалевские строки вообще, а все их выделяли руками через GetMem/FreeMem?
хз, думаю больше. но умность не гарантия безошибочности.
Пожалуй я сольюсь из спора. появится нормальная возможность реализации хитрых указателей - посмотрим
Пожалуй я сольюсь из спора. появится нормальная возможность реализации хитрых указателей - посмотрим
Почему Management Operators -- ненормальная возможность?
zub писал(а):Пожалуй я сольюсь из спора.появится нормальная возможность реализации хитрых указателей - посмотрим
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 писал(а):Проблема даже не в том что нужно переделать компилятор, а в том что нужно еще все библиотеки и существующий на Паскале софт переделать.
Это не проблема это задача.
Без этого нет смысла в развитии языка, вон добавили дженерики и что? где TComboBox<TMyObject>.Items<T> (или как там)?.
Нужно так развивать язык чтоб он качественно улучшал разработку, уже давно очевидно что без переписывания не обойтись а значит новые возможности должны упрощать переписывание, вместо страницы кода один вызов функции и прогеры с радостью перепишут.
>>Почему Management Operators -- ненормальная возможность?
Убедился что появились в 3.2 не знал
>>Что в ней тебе не нравится?
Интерфейсы
Добавлено спустя 1 минуту 50 секунд:
>>Нужно так развивать язык чтоб он качественно улучшал разработку
Паскаль это паскаль. Тебе придется придумать чтото новое, на базе
Убедился что появились в 3.2 не знал
>>Что в ней тебе не нравится?
Интерфейсы
Добавлено спустя 1 минуту 50 секунд:
>>Нужно так развивать язык чтоб он качественно улучшал разработку
Паскаль это паскаль. Тебе придется придумать чтото новое, на базе
в паскале не было классов и интерфейсов и ничего в припрыжку перешли на них
zub писал(а):Интерфейсы
Та приблуда, которой сейчас пользуюсь, примерно то же самое с заменой интерфейса на Management Operators.
Разница в производительности ~30%, по памяти не считал.
sts писал(а):Без этого нет смысла в развитии языка, вон добавили дженерики и что? где TComboBox<TMyObject>.Items<T> (или как там)?.
Генерики(по крайней мере в текущем состоянии) в сочетании с виртуальными методами это та ещё субстанция.
Посмотрел примеры Management Operators
Насколько я понял поведение "аля стринг" на них не реализовать(( и стринги не переписать на этой фиче внутри компилятора - компиляторные managed типы так и останутся магическими((
Добавлено спустя 1 минуту 23 секунды:
>>в паскале не было классов и интерфейсов и ничего в припрыжку перешли на них
это новые фичи, старый код вполне работает без них
Добавлено спустя 2 минуты 12 секунд:
>>Насколько я понял поведение "аля стринг" на них не реализовать((
имею ввиду служебную инфу по отрицательному смещению и возможность использовать как указатель непосредственно на данные
Насколько я понял поведение "аля стринг" на них не реализовать(( и стринги не переписать на этой фиче внутри компилятора - компиляторные managed типы так и останутся магическими((
Добавлено спустя 1 минуту 23 секунды:
>>в паскале не было классов и интерфейсов и ничего в припрыжку перешли на них
это новые фичи, старый код вполне работает без них
Добавлено спустя 2 минуты 12 секунд:
>>Насколько я понял поведение "аля стринг" на них не реализовать((
имею ввиду служебную инфу по отрицательному смещению и возможность использовать как указатель непосредственно на данные
Эта фича осталась недоделанной, но Copy On Write на ней организовать вполне можно.
имею ввиду служебную инфу по отрицательному смещению и возможность использовать как указатель непосредственно на данные
Ужас :) Можно же написать у своих строк методы .GetHackedInfo и .GetRawPtr и это повысит читабельность кода, разве нет?
>>Можно же написать у своих строк
Можно.
А стринги на них переписать - нет
Можно.
А стринги на них переписать - нет
