|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#31
|
||||
|
||||
Цитата:
Код:
type TMyObject = class private FMem: Pointer; public constructor Create(MemSize: Integer = 8192); destructor Destroy; override; property Mem: Pointer read FMem; end; constructor TMyObject.Create(MemSize: Integer); begin GetMem(FMem, MemSize); end; destructor TMyObject.Destroy; begin FreeMem(FMem); ShowMessage(ClassName + '.Destroy'); inherited; end; procedure TMainForm.Button1Click(Sender: TObject); var MyArray: array of TMyObject; begin SetLength(MyArray, 2); MyArray[1] := TMyObject.Create; SetLength(MyArray, 1); MyArray[0] := TMyObject.Create; end; Не стоит путать форумы с богадельнями. © Bargest |
#32
|
||||
|
||||
При неправильном подходе к задаче, можно долго наслаждаться чем угодно и как угодно. Постоянно путаешь выделение памяти и объекты.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#33
|
||||
|
||||
Цитата:
Код:
procedure TMainForm.Button1Click(Sender: TObject); var MyArray: array [0..1] of TMyObject; begin MyArray[1] := TMyObject.Create; MyArray[0] := TMyObject.Create; end; Код:
procedure TMainForm.Button1Click(Sender: TObject); var MyObj0, MyObj1: TMyObject; begin MyObj1 := TMyObject.Create; MyObj0 := TMyObject.Create; end; Или вот ещё небольшой пример того, почему разрушение массива не должно вызывать деструкторы объектов: Код:
procedure TForm1.Button1Click(Sender: TObject); var A: array of TEdit; i: Integer; begin // Находим нужные элементы управления на форме и помещаем в массив ссылки на них: SetLength(A, FCount); for i := 1 to FCount do begin A[i] := (FindComponent('Edit'+IntToStr(i)) as TEdit); end; // Теперь через массив удобно работать с этими элементами управления. // А после выхода из этого обработчика динамический массив будет автоматически разрушен // и что если при этом он вызовет деструкторы элементов управления? // Они же пропадут с формы... Разве входило в планы разрушить интерфейс пользователю? end; |
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
Aristarh Dark (31.03.2014)
|
#34
|
||||
|
||||
Как я понял из всего этого холивара, Фриман имеет ввиду, зачем разрешено в дельфи использовать дин. массивы для объектов и откуда взялась фишка давать в примерах использование оных для объектов.
Вот и вся суть холивара. — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение: | ||
Freeman (01.04.2014)
|
#35
|
||||
|
||||
а еще у Win32 Common Controls можно к элементам привязать указатели на объекты, которые тоже не освобождаются при удалении элемента. тоже запрещать что-ли?
Пишу программы за еду. __________________ |
#36
|
||||
|
||||
Да вообще указатели запретить... И все ЯВУ... Пусть на ассемблере пишут, а то зажрались...
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#37
|
||||
|
||||
Цитата:
Наоборот, запретить ассемблер, все ЯВУ, разрешить только жабу, C# и скрипты. Привет, андройд. jmp $ ; Happy End! The Cake Is A Lie. |
#38
|
||||
|
||||
Цитата:
Цитата:
Свою задачу как разработчика ЯП я вижу в восстановлении справедливости при сохранности природы компилируемого кода как таковой. В частности, вместо сборки мусора я хочу задействовать граф владения, использующий счетчик ссылок когда потребуется и вычисляемую еще на этапе компиляции достижимость объектов во всех остальных случаях. Не стоит путать форумы с богадельнями. © Bargest |
#39
|
||||
|
||||
У вашего подхода есть один фатальный недостаток...
Код:
TMyThread.Create(...); Ссылок на него нету. Вы разрушите объект? Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#40
|
||||
|
||||
Прямые указатели зачастую позволяют значительно повысить скорость обработки. Например, можно иметь буферы, по которым бегают несколько указателей, и все эти указатели объединены в структуру. Или обход массива через указатели. Или из одних и тех же объектов в памяти строятся разные не владеющие ими структуры (дерево и массив, к примеру).
Многие из подобных вещей после запрета указателей, конечно, остаются реализуемыми, но с большими проблемами и теряют всю суть. А если указатели не запретить, то и собирать мусор каким-либо образом становится почти невозможно - ведь я запросто могу поставить указатель не на начало объекта (напр. на середину массива или на какое-то поле объекта), и сохранить его в какой-нибудь структуре. И будет совершенно непонятно, надо удалять объект или нет. Что же касается "за памятью должен следить компьютер, а не программист" - видел как-то программу на .NET, которая после часа работы написала "Not Enough Memory" и отрубилась. Также сталкивался с тем, что всеми любимый SharpZipLib течет на некоторых архивах (у меня он обрабатывал круглые сутки десятки тысяч штук). То есть кривые руки и отсутствие мозгов даже на таком ограниченном языке, как C#, могут добиться утечек. А при прямых руках - мне бы и в голову не пришло уменьшать длину массива, не удаляя объекты, если я знаю, что это массив объектов. Поэтому я предпочитаю в любых мало-мальски критичных вещах следить за памятью самостоятельно. В большинстве случаев это не так трудно. Цитата:
А еще их легко ломать... jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 01.04.2014 в 11:38. |
#42
|
||||
|
||||
Концепции ООП:
1) Всё - объект. Объект - экземпляр класса. Объект - абстракция. 2) Классы могут выстраивать структуру (как минимум дерево). 3) Объекты могут взаимодействовать друг с другом. Ну или из любого учебника - "полиморфизм, инкапсуляция, наследование". Основная цель ООП - абстрагироваться от компьютера, описать множество сущностей и их взаимодействие. Сюда же входит и желание забыть о конечных ресурсах: ведь мы решаем какую-то абстрактную задачу. В концепции ООП нет места таким понятиям, как "низкое быстродействие" или "конечная память". Все решается на сферических сущностях в вакууме (хотя из-за того, что это работает на реальном железе, порой приходится-таки учитывать расход ресурсов). Все это сделано на уровне байт-кода в жабе/c#. Пруфлинк - почитать Instruction Set на документации oracle или доки на IL (с такими не сталкивался, реверсил C# "на ходу"). jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 01.04.2014 в 21:28. |
#43
|
||||
|
||||
Цитата:
Где будут описаны твои переменные со ссылкой на создаваемый поток? Локальная переменная в процедуре точки входа будет считаться владеющей ссылкой и будет существовать всё время в пределах своей области видимости -- всё время, пока выполняется begin..end программы. Цитата:
Цитата:
Не стоит путать форумы с богадельнями. © Bargest |
#44
|
||||
|
||||
Цитата:
new-instance создает непосредственно объект. Далее есть instance-of, проверяющий, является ли объект экземпляром класса или его наследником. Во все invoke-и и getfield/putfield передается строка с именем класса или же экземпляр класса, от которого в случае несущестовования метода/поля будет браться родитель и искаться соответствующий метод/поле. Ну и интерфейсы еще прилеплены. Таким образом, на уровне архитектуры машины может быть построено дерево классов и происходить работа с ним. Полноценная реализация наследования (статического, разумеется). Цитата:
ООП же требует, чтобы весь алгоритм был взаимодействием объектов, что вообще-то идет поперек принципа работы машины - последовательного выполнения действий. Понятно, что взаимодействие объектов можно описать последовательностью действий, но это уже выход за рамки ООП и переход к реализации, так сказать, "движка ООП". jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 01.04.2014 в 23:49. |
#45
|
||||
|
||||
Цитата:
У меня уже сложилась в голове структура байт-кода Кантора, и теперь я могу сравнивать ее с другими реализациями. Шутки шутками, но мой байт-код больше всего похож на Бейсик 80-х. Стало также понятно, почему так быстро удалось создать свой байт-код разработчикам "Фантома": они наверняка слегка изменили правила наследования и поиска методов, а всё остальное оставили как в Java. Это мои предположения, лезть в "Фантом" больше не хочется. Цитата:
В случае же ООП полной замены не произошло. ОО-средства были добавлены (прикручены сбоку -- в моей трактовке) в структурные языки, и классы с объектами стали сосуществовать рядом с обычными, необъектными типами. ОО в виде расширений было массовым, и со временем закрепилось в сознании именно в таком виде. Мол, объект -- это "запись с методами", доступная или напрямую, или по указателю. Стали накручивать на это другие слои, вроде интерфейсов, фабрик классов, и пошло-поехало. На самом же деле, если почитать классические труды по ООП (того же Алана Кея), в них нигде не говорится, что объект -- это именно запись с методами. Даже посылку сообщения можно трактовать как прямой вызов метода, если требуется статическая типизация. Вот я и поставил перед собой задачу вписать ООП в компилятор заподлицо, чтобы программистам было понятно, что Не стоит путать форумы с богадельнями. © Bargest |