К>Язык никто и не хаял особо, просто слишком много делается за программиста и без особого его ведома этого самого программиста, т.е. что внутрях там происходит только создателям известно...
вот это точно. полностью согласен
я когда на дельфе начал писать сразу поселился в окне CPU
мрак.
понимать там нечего — это нужно просто знать, а узнать проще всего из CPU window
Здравствуйте, Курилка, Вы писали:
К>просто слишком много делается за программиста и без особого его ведома этого самого программиста, т.е. что внутрях там происходит только создателям известно
Вот уж ЭТО зависит полностью от этого самого программиста.
Здравствуйте, s.ts, Вы писали:
ST>если проекты просты, то 1-й этап (написания спец. библиотек классов) сожно опустить
Но вопрос в том, что эти библиотеки в дельфах ну не всегда подходят...
ST>кстати, такое впечатление, ты расстроен тем, что программы писать становится все проще и проще ?
Нифига, наоборот, что для того чтобы писать программы надо больше фигачить — допустим теже интерфейсы пихать для автоматических деструкторов, тогда как в плюсах это изначально так, другое дело, что в дельфе переменные есть по сути ссылки, из-за этого и грабли с деструкторами и пр.
Здравствуйте, kavlad, Вы писали:
K>Здравствуйте, s.ts, Вы писали:
ST>>Здравствуйте, Курилка, Вы писали:
К>>>Так я не пойму — можно ли заставить дельфи деструкторы вызывать или нет? Или из твоего текста
ST>>можно, но это будет криво выглядеть
K>Не так уж и криво. K>Часто надо использовать локальные переменные — экземпляры классов, например, TStringList. K>Тогда можно написать приметрно такой код:
это понятно, можно было код не рисовать.
и так ясно, что он кривой:
1. создание доп. наследников от существующих классов для реализации подсчета ссылок
2. постоянное явное приведение типов
К>Нифига, наоборот, что для того чтобы писать программы надо больше фигачить — допустим теже интерфейсы пихать для автоматических деструкторов, тогда как в плюсах это изначально так, другое дело, что в дельфе переменные есть по сути ссылки, из-за этого и грабли с деструкторами и пр.
Не совсем так есть packed object
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, kavlad, Вы писали:
K>Здравствуйте, Курилка, Вы писали:
К>>просто слишком много делается за программиста и без особого его ведома этого самого программиста, т.е. что внутрях там происходит только создателям известно
K>Вот уж ЭТО зависит полностью от этого самого программиста.
Ты уверен???
Глянь вон на соседний пост
Да и смысл деструкторов в дельфах я теперь уже не понимаю тогда, в плюсах понятно — он вызывается когда уничтожается объект, а в дельфах получается наоборот что ли? — он используется для уничтожения объектов??
> это понятно, можно было код не рисовать. > и так ясно, что он кривой: > 1. создание доп. наследников от существующих классов для реализации подсчета ссылок ну да! а auto_ptr не создает временный объект > 2. постоянное явное приведение типов
согласен что шаблоны это хорошо, но можно опять же глянуть библиотеку SIL
так многое уже сделано!
> Да и смысл деструкторов в дельфах я теперь уже не понимаю тогда, в плюсах понятно — он вызывается когда уничтожается объект, а в дельфах получается наоборот что ли? — он используется для уничтожения объектов??
давай зрить в корень!
1. Делфи быстрый компилятор
2. Для этого он должен быть однопроходным
3. Для этого объявление должно быть до использования
4. Поэтому нет автоконструкторов
5. Что такое автодеструктор без автоконструктора!? Это бред!
S>> Не надо хаять Язык.
К>Язык никто и не хаял особо, просто слишком много делается за программиста и без особого его ведома этого самого программиста, т.е. что внутрях там происходит только создателям известно...
Зачем же создателям. Бери исходники в System и изучай. Все достаточно прозрачно.
А ели есть проблемы то поможем. К>Конечно в васике это почище ещё гораздо, но в васике этого не скрывают, да и сравнение-то велось не с ним, а с плюсами...
А вот с Васиком как раз другая картина.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, Курилка, Вы писали:
К>>Нифига, наоборот, что для того чтобы писать программы надо больше фигачить — допустим теже интерфейсы пихать для автоматических деструкторов, тогда как в плюсах это изначально так, другое дело, что в дельфе переменные есть по сути ссылки, из-за этого и грабли с деструкторами и пр. S> Не совсем так есть packed object
Пиши со знаками припинания, плиз
А пакет он же для выравнивания используется только? И к деструкторам уж совсем не относится...
Здравствуйте, Курилка, Вы писали:
К>Да и смысл деструкторов в дельфах я теперь уже не понимаю тогда, в плюсах понятно — он вызывается когда уничтожается объект, а в дельфах получается наоборот что ли? — он используется для уничтожения объектов??
Точно-точно. А конструктор — для их создания В нем идет вызов NewInstance, которая выделяет память для экземпляра.
Вообще-то, это дело привычки. Delphi lang — очень простой язык, скажу больше, автоматическое уничтожение иногда очень путает новичков, например, здесь:
function smth: PChar;
var
S: string;
begin
S := ...;
Result := PChar(S);
end;
К>Ты уверен??? К>Глянь вон на соседний пост К>Да и смысл деструкторов в дельфах я теперь уже не понимаю тогда, в плюсах понятно — он вызывается когда уничтожается объект, а в дельфах получается наоборот что ли? — он используется для уничтожения объектов??
В Delphi все объекты располагаются в куче. Структуры — packed object в стеке.
Поэтому Destroy освобождает память (не совсем освобождает так как использутся менеджер памяти о помечает как не используемую или при превышении неиспользованного блока более помоему 64кб (или 16) возвращает ее системе) и вызывает деструкторы всех внедренных объектов.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, Курилка, Вы писали:
S>>> Не надо хаять Язык.
К>>Язык никто и не хаял особо, просто слишком много делается за программиста и без особого его ведома этого самого программиста, т.е. что внутрях там происходит только создателям известно...
S> Зачем же создателям. Бери исходники в System и изучай. Все достаточно прозрачно.
А там есть исходники компилера? Что-то сомневаюсь...
А деструкторы там явно не написано как создаются и вызываются...
S> А ели есть проблемы то поможем. К>>Конечно в васике это почище ещё гораздо, но в васике этого не скрывают, да и сравнение-то велось не с ним, а с плюсами... S> А вот с Васиком как раз другая картина.
Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, Курилка, Вы писали:
К>>Ты уверен??? К>>Глянь вон на соседний пост К>>Да и смысл деструкторов в дельфах я теперь уже не понимаю тогда, в плюсах понятно — он вызывается когда уничтожается объект, а в дельфах получается наоборот что ли? — он используется для уничтожения объектов?? S> В Delphi все объекты располагаются в куче. Структуры — packed object в стеке. S>Поэтому Destroy освобождает память (не совсем освобождает так как использутся менеджер памяти о помечает как не используемую или при превышении неиспользованного блока более помоему 64кб (или 16) возвращает ее системе) и вызывает деструкторы всех внедренных объектов.
Т.е. с ног на голову всё?
Получаем картинку, которую Oleg рядом нарисовал, ясно всё...
Здравствуйте, Курилка, Вы писали:
К>А там есть исходники компилера? Что-то сомневаюсь... К>А деструкторы там явно не написано как создаются и вызываются...
Бери и иследуй класс TObject. Там все расписано.
И все действия со строками и динамическими массивами. Ну а исходники компилятора ....
class function TObject.NewInstance: TObject;
begin
Result := InitInstance(_GetMem(InstanceSize));
end;
class function TObject.InitInstance(Instance: Pointer): TObject;
{$IFDEF PUREPASCAL}var
IntfTable: PInterfaceTable;
ClassPtr: TClass;
I: Integer;
begin
FillChar(Instance^, InstanceSize, 0);
PInteger(Instance)^ := Integer(Self);
ClassPtr := Self;
while ClassPtr <> nil do
begin
IntfTable := ClassPtr.GetInterfaceTable;
if IntfTable <> nil then
for I := 0 to IntfTable.EntryCount-1 do
with IntfTable.Entries[I] do
begin
if VTable <> nil then
PInteger(@PChar(Instance)[IOffset])^ := Integer(VTable);
end;
ClassPtr := ClassPtr.ClassParent;
end;
Result := Instance;
end;
procedure TObject.CleanupInstance;
{$IFDEF PUREPASCAL}var
ClassPtr: TClass;
InitTable: Pointer;
begin
ClassPtr := ClassType;
InitTable := PPointer(Integer(ClassPtr) + vmtInitTable)^;
while (ClassPtr <> nil) and (InitTable <> nil) do
begin
_FinalizeRecord(Self, InitTable);
ClassPtr := ClassPtr.ClassParent;
if ClassPtr <> nil then
InitTable := PPointer(Integer(ClassPtr) + vmtInitTable)^;
end;
end;
procedure TObject.FreeInstance;
begin
CleanupInstance;
_FreeMem(Self);
end;
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Курилка, Вы писали:
S>> Зачем же создателям. Бери исходники в System и изучай. Все достаточно прозрачно.
К>А там есть исходники компилера? Что-то сомневаюсь... К>А деструкторы там явно не написано как создаются и вызываются...
Зато все написано в хелпе. Если покопаться
В Delphi экземпляры классов хранятся только в куче, больше нигде. Переменная типа класса всего лишь указатель.
Деструктор вызывается автоматически только в одном случае, когда в конструкторе возникла исключительная ситуация.
Если объект создан — будь добр уничтожить его, когда он не нужен, вызовом деструктора.
После выполнения всего кода деструктор дополнительно вызывает FreeInstance, освобождая память.
Классы в Delphi создаются вызовом конструктора как метода класса, то есть MyObject := TMyObject.Create; например. В этом случае конструктор вызывает прежде всего NewInstance, которая выделяет память под экземпляр класса в куче и обнуляет все его поля. Замечу, что при вызове конструктора как простого метода, например, MyObject.Create, NewInstance не вызывается, а просто выполняется его код. Вот, собственно, и вся кухня.
> Зато все написано в хелпе. Если покопаться > В Delphi экземпляры классов хранятся только в куче, больше нигде. Переменная типа класса всего лишь указатель. > Деструктор вызывается автоматически только в одном случае, когда в конструкторе возникла исключительная ситуация.
Тааакккк... это где такое!?
IMHO бред!
Проверяемс
program test;
{$APPTYPE CONSOLE}uses
SysUtils;
type
TDestroyOnException = class
public
constructor Create();
destructor Destroy(); override;
end;
constructor TDestroyOnException.Create();
begin
raise Exception.Create('exception :TDestroyOnException.Create()');
end;
destructor TDestroyOnException.Destroy();
begin
WriteLn('Destroy');
end;
var
D: TDestroyOnException;
begin
try
D := TDestroyOnException.Create();
WriteLn('D is Created');
try
finally
WriteLn('Destroy D');
D.Free;
WriteLn('D is Destroyed');
end;
except
on E: Exception do
WriteLn(E.Message);
end;
end.
Здравствуйте, Oleg A. Bachin, Вы писали:
>> Зато все написано в хелпе. Если покопаться >> В Delphi экземпляры классов хранятся только в куче, больше нигде. Переменная типа класса всего лишь указатель. >> Деструктор вызывается автоматически только в одном случае, когда в конструкторе возникла исключительная ситуация. OAB>Тааакккк... это где такое!? OAB>IMHO бред!
OAB>Проверяемс
OAB>
OAB>program test;
OAB>{$APPTYPE CONSOLE}
Ж)) Гыыы. Проверил?
Не могу больше. :))) Проверь
[pascal]
destructor TDestroyOnException.Destroy();
begin
ShowMessage('Destroy');
end;
А можешь вовсе не проверять, здесь логики достаточно, если бы конструктор на исключение не вызывал деструктор, была бы утечка памяти.
> А можешь вовсе не проверять, здесь логики достаточно, если бы конструктор на исключение не вызывал деструктор, была бы утечка памяти.
внатуре стормозил....
с примером в смысле
деструктор объявлен как override!
класс TObject к этому моменту был создан и его деструктор был вызван...
по vmt попали и к нам....
если сделать reintroduce? то деструктор не будет вызван! и это правильно!!!
преставь тогда такой код:
type
TDestroyOnException = class
private
L: TStringList;
public
constructor Create();
destructor Destroy(); override;
end;
constructor TDestroyOnException.Create();
begin
raise Exception.Create('exception :TDestroyOnException.Create()');
L := TStringList.Create;
end;
destructor TDestroyOnException.Destroy();
begin
L.Free;
WriteLn('Destroy');
end;