Re[10]: Smart pointers(деструкторы) в у Delphi
От: s.ts  
Дата: 25.02.04 13:51
Оценка:
Здравствуйте, Курилка, Вы писали:


К>Язык никто и не хаял особо, просто слишком много делается за программиста и без особого его ведома этого самого программиста, т.е. что внутрях там происходит только создателям известно...


вот это точно. полностью согласен
я когда на дельфе начал писать сразу поселился в окне CPU
мрак.
понимать там нечего — это нужно просто знать, а узнать проще всего из CPU window
Re[10]: Smart pointers(деструкторы) в у Delphi
От: kavlad Россия http://www.wavesoft.ru
Дата: 25.02.04 13:52
Оценка:
Здравствуйте, Курилка, Вы писали:

К>просто слишком много делается за программиста и без особого его ведома этого самого программиста, т.е. что внутрях там происходит только создателям известно


Вот уж ЭТО зависит полностью от этого самого программиста.
Re[8]: Smart pointers(деструкторы) в у Delphi
От: Курилка Россия http://kirya.narod.ru/
Дата: 25.02.04 13:55
Оценка:
Здравствуйте, s.ts, Вы писали:

ST>если проекты просты, то 1-й этап (написания спец. библиотек классов) сожно опустить


Но вопрос в том, что эти библиотеки в дельфах ну не всегда подходят...

ST>кстати, такое впечатление, ты расстроен тем, что программы писать становится все проще и проще ?


Нифига, наоборот, что для того чтобы писать программы надо больше фигачить — допустим теже интерфейсы пихать для автоматических деструкторов, тогда как в плюсах это изначально так, другое дело, что в дельфе переменные есть по сути ссылки, из-за этого и грабли с деструкторами и пр.
Re[5]: Smart pointers(деструкторы) в у Delphi
От: s.ts  
Дата: 25.02.04 14:02
Оценка:
Здравствуйте, kavlad, Вы писали:

K>Здравствуйте, s.ts, Вы писали:


ST>>Здравствуйте, Курилка, Вы писали:


К>>>Так я не пойму — можно ли заставить дельфи деструкторы вызывать или нет? Или из твоего текста


ST>>можно, но это будет криво выглядеть


K>Не так уж и криво.

K>Часто надо использовать локальные переменные — экземпляры классов, например, TStringList.
K>Тогда можно написать приметрно такой код:


это понятно, можно было код не рисовать.
и так ясно, что он кривой:
1. создание доп. наследников от существующих классов для реализации подсчета ссылок
2. постоянное явное приведение типов
Re[9]: Smart pointers(деструкторы) в у Delphi
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 25.02.04 14:08
Оценка:
Здравствуйте, Курилка, Вы писали:


К>Нифига, наоборот, что для того чтобы писать программы надо больше фигачить — допустим теже интерфейсы пихать для автоматических деструкторов, тогда как в плюсах это изначально так, другое дело, что в дельфе переменные есть по сути ссылки, из-за этого и грабли с деструкторами и пр.

Не совсем так есть packed object
и солнце б утром не вставало, когда бы не было меня
Re[11]: Smart pointers(деструкторы) в у Delphi
От: Курилка Россия http://kirya.narod.ru/
Дата: 25.02.04 14:18
Оценка:
Здравствуйте, kavlad, Вы писали:

K>Здравствуйте, Курилка, Вы писали:


К>>просто слишком много делается за программиста и без особого его ведома этого самого программиста, т.е. что внутрях там происходит только создателям известно


K>Вот уж ЭТО зависит полностью от этого самого программиста.


Ты уверен???
Глянь вон на соседний пост
Да и смысл деструкторов в дельфах я теперь уже не понимаю тогда, в плюсах понятно — он вызывается когда уничтожается объект, а в дельфах получается наоборот что ли? — он используется для уничтожения объектов??
Re[6]: Smart pointers(деструкторы) в у Delphi
От: Oleg A. Bachin Украина  
Дата: 25.02.04 14:19
Оценка:
> это понятно, можно было код не рисовать.
> и так ясно, что он кривой:
> 1. создание доп. наследников от существующих классов для реализации подсчета ссылок
ну да! а auto_ptr не создает временный объект
> 2. постоянное явное приведение типов
согласен что шаблоны это хорошо, но можно опять же глянуть библиотеку SIL
так многое уже сделано!
Posted via RSDN NNTP Server 1.7 "Bedlam"
Best regards,
Oleg A. Bachin
Re[12]: Smart pointers(деструкторы) в у Delphi
От: Oleg A. Bachin Украина  
Дата: 25.02.04 14:28
Оценка: +1
> Да и смысл деструкторов в дельфах я теперь уже не понимаю тогда, в плюсах понятно — он вызывается когда уничтожается объект, а в дельфах получается наоборот что ли? — он используется для уничтожения объектов??

давай зрить в корень!

1. Делфи быстрый компилятор
2. Для этого он должен быть однопроходным
3. Для этого объявление должно быть до использования
4. Поэтому нет автоконструкторов
5. Что такое автодеструктор без автоконструктора!? Это бред!
Posted via RSDN NNTP Server 1.7 "Bedlam"
Best regards,
Oleg A. Bachin
Re[10]: Smart pointers(деструкторы) в у Delphi
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 25.02.04 14:29
Оценка:
Здравствуйте, Курилка, Вы писали:


S>> Не надо хаять Язык.


К>Язык никто и не хаял особо, просто слишком много делается за программиста и без особого его ведома этого самого программиста, т.е. что внутрях там происходит только создателям известно...


Зачем же создателям. Бери исходники в System и изучай. Все достаточно прозрачно.
А ели есть проблемы то поможем.
К>Конечно в васике это почище ещё гораздо, но в васике этого не скрывают, да и сравнение-то велось не с ним, а с плюсами...
А вот с Васиком как раз другая картина.
и солнце б утром не вставало, когда бы не было меня
Re[10]: Smart pointers(деструкторы) в у Delphi
От: Курилка Россия http://kirya.narod.ru/
Дата: 25.02.04 14:29
Оценка: +1
Здравствуйте, Serginio1, Вы писали:

S>Здравствуйте, Курилка, Вы писали:



К>>Нифига, наоборот, что для того чтобы писать программы надо больше фигачить — допустим теже интерфейсы пихать для автоматических деструкторов, тогда как в плюсах это изначально так, другое дело, что в дельфе переменные есть по сути ссылки, из-за этого и грабли с деструкторами и пр.

S> Не совсем так есть packed object

Пиши со знаками припинания, плиз
А пакет он же для выравнивания используется только? И к деструкторам уж совсем не относится...
Re[12]: Smart pointers(деструкторы) в у Delphi
От: Romkin  
Дата: 25.02.04 14:38
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Да и смысл деструкторов в дельфах я теперь уже не понимаю тогда, в плюсах понятно — он вызывается когда уничтожается объект, а в дельфах получается наоборот что ли? — он используется для уничтожения объектов??


Точно-точно. А конструктор — для их создания В нем идет вызов NewInstance, которая выделяет память для экземпляра.
Вообще-то, это дело привычки. Delphi lang — очень простой язык, скажу больше, автоматическое уничтожение иногда очень путает новичков, например, здесь:
function smth: PChar;
var
  S: string;
begin
  S := ...;
  Result := PChar(S);
end;

Кстати, AV может и не дать при использовании
Re[12]: Smart pointers(деструкторы) в у Delphi
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 25.02.04 14:39
Оценка:
Здравствуйте, Курилка, Вы писали:


К>Ты уверен???

К>Глянь вон на соседний пост
К>Да и смысл деструкторов в дельфах я теперь уже не понимаю тогда, в плюсах понятно — он вызывается когда уничтожается объект, а в дельфах получается наоборот что ли? — он используется для уничтожения объектов??
В Delphi все объекты располагаются в куче. Структуры — packed object в стеке.
Поэтому Destroy освобождает память (не совсем освобождает так как использутся менеджер памяти о помечает как не используемую или при превышении неиспользованного блока более помоему 64кб (или 16) возвращает ее системе) и вызывает деструкторы всех внедренных объектов.
и солнце б утром не вставало, когда бы не было меня
Re[11]: Smart pointers(деструкторы) в у Delphi
От: Курилка Россия http://kirya.narod.ru/
Дата: 25.02.04 14:50
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>Здравствуйте, Курилка, Вы писали:



S>>> Не надо хаять Язык.


К>>Язык никто и не хаял особо, просто слишком много делается за программиста и без особого его ведома этого самого программиста, т.е. что внутрях там происходит только создателям известно...


S> Зачем же создателям. Бери исходники в System и изучай. Все достаточно прозрачно.


А там есть исходники компилера? Что-то сомневаюсь...
А деструкторы там явно не написано как создаются и вызываются...

S> А ели есть проблемы то поможем.

К>>Конечно в васике это почище ещё гораздо, но в васике этого не скрывают, да и сравнение-то велось не с ним, а с плюсами...
S> А вот с Васиком как раз другая картина.

Не будем отвлекаться
Re[13]: Smart pointers(деструкторы) в у Delphi
От: Курилка Россия http://kirya.narod.ru/
Дата: 25.02.04 14:55
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>Здравствуйте, Курилка, Вы писали:



К>>Ты уверен???

К>>Глянь вон на соседний пост
К>>Да и смысл деструкторов в дельфах я теперь уже не понимаю тогда, в плюсах понятно — он вызывается когда уничтожается объект, а в дельфах получается наоборот что ли? — он используется для уничтожения объектов??
S> В Delphi все объекты располагаются в куче. Структуры — packed object в стеке.
S>Поэтому Destroy освобождает память (не совсем освобождает так как использутся менеджер памяти о помечает как не используемую или при превышении неиспользованного блока более помоему 64кб (или 16) возвращает ее системе) и вызывает деструкторы всех внедренных объектов.

Т.е. с ног на голову всё?
Получаем картинку, которую Oleg рядом нарисовал, ясно всё...
Re[12]: Smart pointers(деструкторы) в у Delphi
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 25.02.04 15:09
Оценка:
Здравствуйте, Курилка, Вы писали:

К>А там есть исходники компилера? Что-то сомневаюсь...

К>А деструкторы там явно не написано как создаются и вызываются...

Бери и иследуй класс 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;
и солнце б утром не вставало, когда бы не было меня
Re[12]: Smart pointers(деструкторы) в у Delphi
От: Romkin  
Дата: 25.02.04 15:12
Оценка: 4 (1)
Здравствуйте, Курилка, Вы писали:

S>> Зачем же создателям. Бери исходники в System и изучай. Все достаточно прозрачно.


К>А там есть исходники компилера? Что-то сомневаюсь...

К>А деструкторы там явно не написано как создаются и вызываются...

Зато все написано в хелпе. Если покопаться
В Delphi экземпляры классов хранятся только в куче, больше нигде. Переменная типа класса всего лишь указатель.
Деструктор вызывается автоматически только в одном случае, когда в конструкторе возникла исключительная ситуация.
Если объект создан — будь добр уничтожить его, когда он не нужен, вызовом деструктора.
После выполнения всего кода деструктор дополнительно вызывает FreeInstance, освобождая память.
Классы в Delphi создаются вызовом конструктора как метода класса, то есть MyObject := TMyObject.Create; например. В этом случае конструктор вызывает прежде всего NewInstance, которая выделяет память под экземпляр класса в куче и обнуляет все его поля. Замечу, что при вызове конструктора как простого метода, например, MyObject.Create, NewInstance не вызывается, а просто выполняется его код. Вот, собственно, и вся кухня.
Re[13]: Smart pointers(деструкторы) в у Delphi
От: Oleg A. Bachin Украина  
Дата: 25.02.04 15:33
Оценка:
> Зато все написано в хелпе. Если покопаться
> В 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.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Best regards,
Oleg A. Bachin
Re[14]: Smart pointers(деструкторы) в у Delphi
От: Romkin  
Дата: 25.02.04 15:46
Оценка:
Здравствуйте, Oleg A. Bachin, Вы писали:

>> Зато все написано в хелпе. Если покопаться

>> В Delphi экземпляры классов хранятся только в куче, больше нигде. Переменная типа класса всего лишь указатель.
>> Деструктор вызывается автоматически только в одном случае, когда в конструкторе возникла исключительная ситуация.
OAB>Тааакккк... это где такое!?
OAB>IMHO бред!

OAB>Проверяемс


OAB>
OAB>program test;

OAB>{$APPTYPE CONSOLE}

Ж)) Гыыы. Проверил? 

Не могу больше.  :))) Проверь 
[pascal]
destructor TDestroyOnException.Destroy();
begin
  ShowMessage('Destroy');
end;

А можешь вовсе не проверять, здесь логики достаточно, если бы конструктор на исключение не вызывал деструктор, была бы утечка памяти.
Re[15]: Smart pointers(деструкторы) в у Delphi
От: Oleg A. Bachin Украина  
Дата: 25.02.04 15:53
Оценка:
> А можешь вовсе не проверять, здесь логики достаточно, если бы конструктор на исключение не вызывал деструктор, была бы утечка памяти.

внатуре стормозил....
с примером в смысле

деструктор объявлен как 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;
Posted via RSDN NNTP Server 1.7 "Bedlam"
Best regards,
Oleg A. Bachin
Re[15]: Smart pointers(деструкторы) в у Delphi
От: Oleg A. Bachin Украина  
Дата: 25.02.04 15:59
Оценка:
скажу честно, я слегка озадачен...
хотя, это ведь TObject! его деструктор должен быть вызван, т.к. он был создан!

да...
вот здесь и кроется весь гемор того, что невозможно в делфях создать класс не от TObject...

хм... надо будет внимательно взглянуть в сторону VirtualPascal или чего-то подобного...
Posted via RSDN NNTP Server 1.7 "Bedlam"
Best regards,
Oleg A. Bachin
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.