Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.22;
Скачать: CL | DM;

Вниз

Delphi + pointer = ?   Найти похожие ветки 

 
Kurtevich   (2004-08-03 12:38) [0]

Вымораживает то, как Дельфя обращается с указателями: когда вызываешь хваленый TObject.Free, он обьект-то освобождает, но переменная все еще на что-то указывает, и проверка obj<>nil возвращает true, со всеми вытекающими отсюда Access Violations... Поэтому приходится всякий раз писать obj.Free; obj := nil;, а это напряжно... Больше всего бесит, что когда вызываешь Obj.Free, который нахваливают за то, что он проверяет obj на nil, он все равно дает AccessViolation если obj=nil, поэтому приходится писать if obj<>nil then obj.Free;

Вобщем, мой вопрос короткий: WHY!?!?! И что вы обо всем этом думаете?


 
TUser ©   (2004-08-03 12:40) [1]

FreeAndNil
или
.Free;
:=nil;


 
Kurtevich   (2004-08-03 12:41) [2]

Удалено модератором
Примечание: Не ругаться


 
Sergey_Masloff   (2004-08-03 12:42) [3]

>поэтому приходится писать if obj<>nil then obj.Free;
слабо глянуть в текст Free()?

Есть метод FreeAndNil() если так уж лень писать myVar := nil;


 
KSergey ©   (2004-08-03 12:44) [4]

> [2] Kurtevich   (03.08.04 12:41)
> > FreeAndNil
> п...ц! а это не то, что я уже написал в вопросе?

Нет, про ф-цию FreeAndNil ты не упоминал.

> Больше всего бесит, что когда вызываешь Obj.Free, который
> нахваливают за то, что он проверяет obj на nil, он все равно
> дает AccessViolation если obj=nil

Вранье наглое.


 
Sergey_Masloff   (2004-08-03 12:45) [5]

Кстати объяснение весьма прозаичное - откуда объект может знать что там на него указывает? Он знает какую память занимает он и высвобождает ее по команде. То есть делает что в его силах.


 
TUser ©   (2004-08-03 12:45) [6]

Удалено модератором


 
KSergey ©   (2004-08-03 12:46) [7]

> Kurtevich   (03.08.04 12:38)
> но переменная все еще на что-то указывает

Разумеется! А разве ее кто-то чистил?? Или как всегда на всемогущего Пушкина надежда?


 
ламер ©   (2004-08-03 12:46) [8]

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

создание объекта - работа с ним - уничтожение. и всё. если ПРАВИЛЬНО пользоваться механизмом обработки исключительных ситуаций, то никаких проверок на nil даже не надо производить.


 
Kurtevich   (2004-08-03 12:47) [9]


> слабо глянуть в текст Free()?

а смысл туда смотреть? и так понятно, что там написано
if self<>nil then free();
только вот если self=nil то до проверки внутри этой процедуры дело не доходит... Error! Access violation at address 0x000! Would you like to send report to microsoft corp.?!


 
TUser ©   (2004-08-03 12:48) [10]

А гляньте в втеку про логи. Если объекты создаются, уничтожаются, потом опять создаются и так много раз - то надо проверять.


 
Kurtevich   (2004-08-03 12:48) [11]


> если ПРАВИЛЬНО пользоваться механизмом обработки исключительных
> ситуаций, то никаких проверок на nil даже не надо производить.

интересно... а можно конкретизировать?


 
KSergey ©   (2004-08-03 12:49) [12]

> [9] Kurtevich   (03.08.04 12:47)
> а смысл туда смотреть? и так понятно, что там написано
> if self<>nil then free();

А вот посмотрел бы - и увидел, что все не так :) Впрочем, можно не смотреть - и так понятно, что не так.
А ошибка у тебя в другом совсем месте, уверяю.


 
Игорь Шевченко ©   (2004-08-03 12:52) [13]


> Вымораживает то


Греться надо.


> когда вызываешь хваленый TObject.Free, он обьект-то освобождает,
> но переменная все еще на что-то указывает, и проверка obj<>nil
> возвращает true, со всеми вытекающими отсюда Access Violations...
>


Так и задумано


> Больше всего бесит, что когда вызываешь Obj.Free, который
> нахваливают за то, что он проверяет obj на nil, он все равно
> дает AccessViolation если obj=nil


Руки выпрями. Помогает.


 
Kurtevich   (2004-08-03 12:52) [14]


> А вот посмотрел бы - и увидел, что все не так

вот странно - посмотрел, а все оказалось именно так! правда вместо free destroy - я конечно это и имел ввиду, просто привычка на автопилоте всегда писать Free... суть от этого не меняется
> А ошибка у тебя в другом совсем месте, уверяю.

да нет у меня вобще никакой ошибке ни в каком месте... просто я не понимаю на хрена рекомендовать этот free как совершенно безопасный, если он ни хрена не работает?!


 
ламер ©   (2004-08-03 12:58) [15]

> Kurtevich   (03.08.04 12:48) [11]
> интересно... а можно конкретизировать?

например:


try
 MyObj := TMyObj.Create;
 try
   // если дошли до этого места, то объект создан.
   MyObj.DoSomeWork;
   // ...
 finally
   // были какие-либо исключения при работе или нет - объект
   // будет уничтожен.
   MyObj.Free;
 end;
except
 // ошибка создания объекта. память освобождается автоматически
 // и ничего уничтожать не надо.
end;


а теперь моё большое имхо. если в процессе работы, приходится проверять, создан объект или нет, значит сам алгоритм написан неверно.


 
KSergey ©   (2004-08-03 13:03) [16]

> [14] Kurtevich   (03.08.04 12:52)
> правда
> вместо free destroy ... суть от этого
> не меняется

Ага, конечно, не меняется
Толи работаем дальше, толи циклимся по полной :)

> я не понимаю на хрена рекомендовать этот free как совершенно
> безопасный, если он ни хрена не работает?!

Это кто, интересно, такое сказал? Покажите пальцем, плиз.
А вообще - есть правила работы с инструметном (дельфи). Работайте в рамках этих правил - и все будет здорово. Инструмент, увы, для другого просто не предназначен. С этим придется мириться.

> [15] ламер ©   (03.08.04 12:58)

А внешний try/except зачем? Для комментария? Или просто привычка все сообщения об ошибках давить? :)


 
ламер ©   (2004-08-03 13:06) [17]

> KSergey ©   (03.08.04 13:03)
> А внешний try/except зачем? Для комментария? Или просто
> привычка все сообщения об ошибках давить? :)
для комментария, т.к. это общий пример.


 
KSergey ©   (2004-08-03 13:08) [18]

Мне почему-то кажется, что в общем примере это как раз лишнее...

А вообще мне наиболее нравится такой общий пример (хотя и не всегда реализуемо по причине совпадения имен методов/свойств)

with TMyObj.Create do
try
...
finally
 Free;
end;


 
Digitman ©   (2004-08-03 13:09) [19]


> не понимаю на хрена рекомендовать этот free как совершенно
> безопасный, если он ни хрена не работает?!


все прекрасно работает

и рекомендация эта относится к методу объекта, который знать ничего не знает и знать не может и не должен о том, сколько переменных, ссылающихся на него, ты сподобился наплодить в своей программе ! Этот метод НЕ ОБЯЗАН вычищать за тобой то, что ты САМ обязан делать, если это требуется по твоей логике


 
TUser ©   (2004-08-03 13:12) [20]

Внешний - для обработок ошибок в конструкторе.


 
ламер ©   (2004-08-03 13:12) [21]

> KSergey ©   (03.08.04 13:08) [18]
просто бывают такие случаи, что работа должна продолжиться, невзирая на то, было ли исключение при создании объекта. да и вывести сообщение понятным для пользователя языком тоже не помешает.


 
Kurtevich   (2004-08-03 13:19) [22]


> try
>  MyObj := TMyObj.Create;
>  try
>    // если дошли до этого места, то объект создан.
>    MyObj.DoSomeWork;


неужели?.. непонятны всего несколько моментов:

а) какое исключение может сгенерироваться в конструкторе обьекта? то есть я не спорю, теоретически-то может (смотря у кого какие конструкторы), хотя в таком случае я и без всяких двойных try пойму что что-то не так :)
б) а если (и это более естественный случай) создание обьекта и его использование расположены по разным процедурам, а не в одном try... except statement?
в) на кой ... мне вобще какя-то проверка в данном случае?

вобщем, утверждение
> если в процессе работы, приходится проверять, создан объект
> или нет, значит сам алгоритм написан неверно
не доказано


 
Kurtevich   (2004-08-03 13:23) [23]


> Ага, конечно, не меняется
> Толи работаем дальше, толи циклимся по полной :)


как я уже сказал, насчет free я просто обшибся, смысл был в том, что надо обьект уничтожается если Self<>nil, поэтому суть не меняется.

при чем здесь сколько переменных я наплодил? зачем проверять self, если раз уж мы добрались внутрь процедуры, то self есть? ... его не может не быть :)


 
Anatoly Podgoretsky ©   (2004-08-03 13:23) [24]

Проверка переменной на нил говорит о попытке повторного использования этой переменной, в правильно написаной программе этого быть не должно, говорит о недостатках дизайна, подлежит переписыванию.


 
Sergey_Masloff   (2004-08-03 13:24) [25]

Kurtevich   (03.08.04 13:19) [22]
>а) какое исключение может сгенерироваться в конструкторе >обьекта? то есть я не спорю, теоретически-то может (смотря у >кого какие конструкторы), хотя в таком случае я и без всяких >двойных try пойму что что-то не так :)
Невозможность выделения какого-либо ресурса по причине отсутствия самого ресурса или прав на его использование

>б) а если (и это более естественный случай) создание обьекта и >его использование расположены по разным процедурам, а не в >одном try... except statement?
Что. Создал и отдал значение указателя. Тот кто взял отвечает за его высвобождение. Твоя задача - если то что собираешься отдавать не создал по тем или иным причинам - корректно верни nil

в) на кой ... мне вобще какя-то проверка в данном случае?


 
Digitman ©   (2004-08-03 13:28) [26]


> раз уж мы добрались внутрь процедуры, то self есть? ...
> его не может не быть


может !! считывается значение "битой" ссылки из переменной и прямой ссылкой передается как неявный параметр Self


 
ламер ©   (2004-08-03 13:31) [27]

> Kurtevich   (03.08.04 13:19) [22]
а) любое. EInOutError, EOutOfMemory, EOutOfResources и т.д. и т.п.
б) значит либо: 1) у вас жутко нетривиальный случай, 2) неверный алгоритм.
в) для нормального продолжения работы.

> вобщем, утверждение не доказано

ой, да я и не собираюсь никому ничего доказывать. это просто моё имхо. за всё время моей работы с дельфи такие случаи (с созданием/уничтожением в разных местах) возникали всего пару раз в результате выбора неверной стратегии. и при удачной перепланировке я всегда получал более интуитивно понятный и надёжный алгоритм.


 
Kurtevich   (2004-08-03 13:32) [28]

jesus... недостатки дизайна, подлежит переписыванию... что за гониво?
а если у меня есть процедура, в которую как параметр передается указатель на обьект, разве это плохой стиль программирования - прежде всего проверить, что бы он был valid?! откуда я знаю что происходило вовне этой процедуры - может система упала и забрала всю память с собой, а осталась висеть только моя прога на обугленных останках монитора... всякое бывает!
и что, повторное использование переменных - это плохо?! я не сомневаюсь что проффессиональные программисты обьявляют новую переменную каждый раз, когда им че-то надо... но это ж заманаться можно! :)


 
Digitman ©   (2004-08-03 13:35) [29]


> система упала и забрала всю память с собой


бред сивой кобылы


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


тоже чушь


 
ламер ©   (2004-08-03 13:35) [30]

> Kurtevich   (03.08.04 13:32) [28]
да, параметр в процедуре - это вариант, в котором действительно иногда бывает необходима проверка. чаще всего можно просто избежать вызова процедуры с указателем на несозданный объект.


 
Anatoly Podgoretsky ©   (2004-08-03 13:36) [31]

Ну если тебе тяжело, то переквалифицируйся в дворники, но и они сейчас работают со сложной техникой.


 
ламер ©   (2004-08-03 13:38) [32]

>если раз уж мы добрались внутрь процедуры, то self есть? его не может не быть :)

Self используется только для вызова виртуальных методов. т.к. Free - невиртуальный, то для его можно вызвать даже так:


TObject(nil).Free;


причём никаких исключений данный вызов не породит :)


 
Kurtevich   (2004-08-03 13:43) [33]


> бред сивой кобылы

согласен. так и замышлялось :)

> TObject(nil).Free;

а вот это я попробую!

> Self используется только для вызова виртуальных методов

то есть, если я правильно понял, я могу вызывать методы несозданного обьекта?! типа
TMYObject(nil).ConnectToMicrosoftComAndDeleteAllData???
весело... или эттот прикол распространяется только на TObject? вобще дельфя конечно умеет повеселить своими скрытыми возможностями :)


 
Kurtevich   (2004-08-03 13:44) [34]

i wonder, на фиг вобще создавать обькты, когда дельфя открывает такие горизонты в ООП!?!


 
Anatoly Podgoretsky ©   (2004-08-03 13:45) [35]

Есди это классовый метод (класса) то можешь, а если это метод объекта то нет, поскольку нет объекта.


 
Sergey Kaminski ©   (2004-08-03 13:49) [36]

Kurtevich   (03.08.04 13:32) [28]
> а если у меня есть процедура, в которую как параметр передается
> указатель на обьект, разве это плохой стиль программирования -
> прежде всего проверить, что бы он был valid?! откуда я знаю что
>происходило вовне этой процедуры


Да, в общем случае, это неважный стиль программирования. И вот почему.
Передача неверного параметра в процедуру ДОЛЖНА вызывать исключение внутри этой процедуры. При этом желательно, чтобы там даже не было подавления Exception. Тогда внешняя процедура легко может отследить (по возникшему эксепшену), что что-то пошло не так.


 
Kurtevich   (2004-08-03 13:51) [37]

я понял, люди, в чем источник нашего взаимонедопонимания!!!
вы слишком обращаете внимание на мелочи вроде того, что я написал free вместо destroy, спровоцировав тем самым рекурсивно бесконечную дисфункцию %(, или на то, что система якобы может забрать у меня всю память (ah jesus it"s a monstrous system from outer space!!!), хотя все это не важно в контексте смысла проблемы.
а теперь более конкретный вопрос: если я напишу
destructor TMyObject.Destroy();
begin
 inherited;
 Self := nil;
end;

чё будет?!... только не надо, пожалуйста писать "запусти, увидишь сам", или "хочешь фокус: я запускаю этот код на твоей машине и смотрю как плавится клавиатура..."... вопрос на самом деле серьезный :)


 
ламер ©   (2004-08-03 13:52) [38]

>Anatoly Podgoretsky ©   (03.08.04 13:45) [35]
> Есди это классовый метод (класса) то можешь, а если это метод
> объекта то нет, поскольку нет объекта.

не совсем так. я, например, для создания форм в ран-тайм использую:


type
 TfrmOption = class (TForm)
 ...
 public
   procedure Call;
 end;

...

procedure TfrmOption.Call;
begin
 Application.CreateForm(TfrmOption, frmOption);
 try
   frmOption.ShowModal;
 finally
   frmOption.Release;
 end;
end;


 
Kurtevich   (2004-08-03 13:54) [39]


> Есди это классовый метод (класса) то можешь, а если это
> метод объекта то нет, поскольку нет объекта.

%-( ооо, раздуплите меня пожалуйста.... я ни черта не понял в вышесказанном!
если я правильно понимаю ООП, то обект - это инициализированная переменная типа класс...
если предположить, что здесь имеется в виду, что метод класса - это когда обьект не создан, то в данном случае никаккого "если" быть не должно!


 
Sergey_Masloff   (2004-08-03 13:56) [40]

Kurtevich   (03.08.04 13:51) [37]
Ты считаешь ЭТО

destructor TMyObject.Destroy();
begin
inherited;
Self := nil;
end;

мелочи?!

Что ты вообще этим кодом хотел сделать?


 
Sergey Kaminski ©   (2004-08-03 13:57) [41]

Он предполагает, что после этого все переменные, в которых есть ссылка на объект будут равны nil. :)


 
ламер ©   (2004-08-03 13:57) [42]

> Kurtevich   (03.08.04 13:51) [37]

> destructor TMyObject.Destroy();
> begin
>  inherited;
>  Self := nil;
> end;

да ничего не будет. ты присвоишь параметру Self значение nil. область видимости Self - лишь текущий метод (в данном случае деструктор).


 
Digitman ©   (2004-08-03 14:00) [43]


> если я правильно понимаю ООП, то обект - это инициализированная
> переменная типа класс


неправильно понимаешь
объект - это структурированная запись
переменная же объектного типа - это именованая область данных, предназначенная для хранения ссылки на объект


>  Self := nil;
> end;
> чё будет?!... вопрос
> на самом деле серьезный :)


ничё не будет... глупость просто будет ... значение Self в контексте исполняющегося метода некоего объекта используется для получения ссылки на самого себя, не более того


 
Sergey_Masloff   (2004-08-03 14:01) [44]

ламер ©   (03.08.04 13:57) [42]
Не надо говорить если не знаешь


 
Kurtevich   (2004-08-03 14:01) [45]

хорошо. ладно. насчет self я прогнал. не подумавши.
только вот все-таки насчет этих самых методов, которые можно вызывать без создания обьекта... если позволите так выразиться, как отличить метод класса от метода обьекта?


 
ламер ©   (2004-08-03 14:03) [46]

> Sergey_Masloff   (03.08.04 14:01) [44]
> ламер ©   (03.08.04 13:57) [42]
> Не надо говорить если не знаешь

ну так просветите меня. в чём я неправ?


 
Digitman ©   (2004-08-03 14:06) [47]


> как отличить метод класса от метода обьекта?


посмотреть как декларирован этот метод в декларации класса, которому метод принадлежит


> насчет этих самых методов, которые можно вызывать без создания
> обьекта


любой статический метод класса можно вызвать без создания экз-ра этого класса ... другое дело, что если в теле метода осущ-ся обращение к полям тек.экз-ра, то AV неминуем


 
Kurtevich   (2004-08-03 14:06) [48]

Удалено модератором


 
Kurtevich   (2004-08-03 14:08) [49]


> посмотреть как декларирован этот метод в декларации класса,
> которому метод принадлежит
ну-ну, и... продолжайте-с, пожалуйста... :)


 
Sergey Kaminski ©   (2004-08-03 14:12) [50]

class procedure X;
class function Y: Byte;


 
Игорь Шевченко ©   (2004-08-03 14:13) [51]


> как отличить метод класса от метода обьекта?


по слову class перед объявлением, не так ли ?


 
Anatoly Podgoretsky ©   (2004-08-03 14:16) [52]

ламер ©   (03.08.04 13:52) [38]
Хоть у тебя и не объявлено методом класса, но по сути таким является. Создание объекта не требуется.


 
Kurtevich   (2004-08-03 14:18) [53]


> по слову class перед объявлением, не так ли ?
ого, ни фига себе... кто бы мог подумать... только вот TObject.Free без такой фишки обьявлен! - а веть речь шла об этом!
то есть все еще получается, что я могу вызвать любой статический метод класса без создания обьекта?
TMyObject(NIL).KissTheSystem();


 
Digitman ©   (2004-08-03 14:18) [54]


> какого ... это вобще может значить???


то и значит, что экз-р класса представляет собой не что иное как запись, структуру ... разницы между тем что из себя изнутри представляют собой экз-ры TMyType = class и TMyType = record фактически нет


> именованная область данных


да, представь себе ! переменная - это (по определению) именованая (!) область данных


> jesus my ass


просто-таки блеск остроумия ! ... ты бы лучше прислушался к тому, что тебе говорят, чем "щеголять" никчемным набором слов


 
Anatoly Podgoretsky ©   (2004-08-03 14:19) [55]

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


 
Kurtevich   (2004-08-03 14:20) [56]

на самом деле всё это совершенно неправильно, и если бы Страусструп был здесь, он бы такого бы не допустил!!! :)
нельзя вызывать методы класса без создания обьекта, это очень WRONG! это уже получается не метод, а просто глобальная процедура, которую зачем-то запихнули в обьвление класса!


 
Sergey_Masloff   (2004-08-03 14:21) [57]

ламер ©   (03.08.04 14:03) [46]
>ну так просветите меня. в чём я неправ?
Я похож на адепта храма просвящения? Пишется код из трех строк ставится брейкпойнт и View->DebugVindow->CPU
посмотри как в @ClassDestroy

mov edx,[eax]
call dword ptr [edx-$08]

и вспомни как пару шагов назад ты сделал (Self := nil)

xor eax,eax

any comment?


 
ламер ©   (2004-08-03 14:21) [58]

> Anatoly Podgoretsky ©   (03.08.04 14:16) [52]
> ламер ©   (03.08.04 13:52) [38]
> Хоть у тебя и не объявлено методом класса, но по сути таким
> является. Создание объекта не требуется.

возможно, я и ошибаюсь, но в классовые методы параметром Self передаётся не ссылка на объект, а ссылка на класс. в данном же случае будет передаваться ссылка именно на объект (nil, если объект не создан).


 
Kurtevich   (2004-08-03 14:23) [59]


> то и значит, что экз-р класса представляет собой не что
> иное как запись, структуру ... разницы между тем что из
> себя изнутри представляют собой экз-ры TMyType = class и
> TMyType = record фактически нет

ну, это еже звучит гораздо лучше, чем

> объект - это структурированная запись


> просто-таки блеск остроумия !

спасибо :) стараюсь :))


 
Anatoly Podgoretsky ©   (2004-08-03 14:23) [60]

ламер ©   (03.08.04 14:21) [58]
А какая тебе разница, раз ты ей не пользуешься?


 
KSergey ©   (2004-08-03 14:27) [61]

>Kurtevich

ООП в дельфи и Си++ несколько отличается. В том числе вот этими моментами. В Си++ нет классовых ф-ций и проч. Даи само понятие класса трактуется несколько иначе
В дельфи же можно даже ссылку на класс забабахать. В С++ - нельзя (непосредственнно в языке), из-за чего в С++ нет (не имеют смысла) виртуальных конструкторов.


 
Kurtevich   (2004-08-03 14:30) [62]


> KSergey ©   (03.08.04 14:27) [61]

дык я ж и говорю, что Дельфи изнасиловала ООП и даже не поцеловала :)
а насчет ссылки на класс - в C++ есть метаклассы, если мне не изменяет память.... хотя может йих добрый дядя Борланд придумал?


 
Sergey_Masloff   (2004-08-03 14:32) [63]

Kurtevich   (03.08.04 14:30) [62]
>что Дельфи изнасиловала ООП и
чушь. ООП <> С++ (или OOP != Cpp - как угодно)


 
Kurtevich   (2004-08-03 14:34) [64]


> ООП <> С++ (или OOP != Cpp - как угодно)

:) круто... только я не понял, причем здесь это? я и не говорил что ООП=С++ или что Дельфи изнасиловала С++...


 
Digitman ©   (2004-08-03 14:34) [65]


> нельзя вызывать методы класса без создания обьекта, это
> очень WRONG!


можно ... именно методы класса - можно ... методы же объекта некоего класса - можно, но осторожно

и Борланд, дав нам такую замечательную гибкость, вовсе не обязан был действовать с оглядкой на какого-то там Kurtevich"а, который, видите ли, трясется от одной только мысли, что не сможет из-за Борланда контролировать времена жизни объектов, им же, Kurtevich"ем, потенциально создаваемых


 
Anatoly Podgoretsky ©   (2004-08-03 14:37) [66]

Digitman ©   (03.08.04 14:34) [65]

Вот только какой-то там Kurtevich"а, с этим не согласен, но продолжается пользоваться этим языком.

Ежики плакали, кололись, но продолжали есть кактус.


 
Kurtevich   (2004-08-03 14:39) [67]


> можно ... именно методы класса - можно ... методы же объекта
> некоего класса - можно, но осторожно

:) я говорю нельзя не в смысле что невозможно, а в смысле что это неправильно, некрасиво, пошло в конце концов! и дело не в том, что я "трясусь", а как раз в том, что так просто неправильно!
насчет "замечательной гибкости"... эх, лучше бы дядя Борланд дал нам гибкость иметь конструкторы по умолчанию и возможность иметь статические обьекты, а не только указатели, или inline процедуры, или... много чего еще... гибкость... %(


 
Kurtevich   (2004-08-03 14:45) [68]


> какой-то там Kurtevich"а, с этим не согласен, но продолжается
> пользоваться этим языком

эх, я ждал, когда же наконец кто-то это скажет! да, каюсь, я очень недоволен Дельфи, но продолжаю им пользоваться.. почему? а почему многие недовольны Виндой, но пользуются ею? или почему многие не любят холод и снег, но зачем-то даже зимой в метель выходят на улицу? или кого-то бесит, что автомобиль приходится заправлять бензином, но он все равно упорно на нем ездит? да потому что НАДО ТАК! и никуда от этого не денешься, но это не значит, что если ты чем-то пользуешься, то ты должен сидеть и радоваться "ах, какая хорошая вещь! она идеальна!"... неужели вам, о великие мастера, ВСЁ нравится в Дельфи? если так, то может вы мало с ней работали? (прошу не рассматривать последнюю фразу как намек на чей-либо непрофессионализм)


 
Algol   (2004-08-03 14:46) [69]


> Kurtevich   (03.08.04 14:30) [62]
> дык я ж и говорю, что Дельфи изнасиловала ООП и даже не
> поцеловала :)


Чего-то я не пойму. Вы хотите сказать что статические методы класса это отход от ООП ??
Да вы посмотрите на современный framework от майкрософта, там статические методы используются на каждом шагу, и гораздо шире чем в Делфе...


 
Думкин ©   (2004-08-03 14:48) [70]

> [56] Kurtevich   (03.08.04 14:20)
> на самом деле всё это совершенно неправильно, и если бы
> Страусструп был здесь, он бы такого бы не допустил!!! :)

Ну вот. Как всегда кривостьв  одном ищется в другом. И в фидо также. Еслия пишу криво, то надо переписать Дельфи нафик, полностью.


 
Kurtevich   (2004-08-03 14:49) [71]


> Algol   (03.08.04 14:46) [69]

не знаю, что вы подразумеваете под статическими методами класса, но если то же, что и я, то я совсем не об этом говорил, а об том, что в Дельфи типа можно вызывать методы класса без создания обьекта. а что  такое framework я все рано не знаю (ах, несчастныя я ламер! :"-( )


 
Digitman ©   (2004-08-03 14:52) [72]


> это неправильно, некрасиво, пошло


ты вообще чего в Паскаль-то приехал ? в Паскале (неважно в каком !) неоднозначности и неопределенности не допускаются в принципе ! Ну и пиши себе на СРР, коль тебе так нравится ! Что ты здесь "разсиплюплювался"-то ?

Паскаль-компилятор работает по однопроходной схеме, многие фичи иных языков в нем попросту нереализуемы (да и за ненадобностью они зачастую) или чрезвычайно сложно реализуемы, но зато Паскаль-компилятор дает несравнимый выигрыш и по производительности компиляции и по предсказуемости поведения скомпилированного кода в ран-тайм


> inline процедуры


таких - полна котомка в system.pas, и этого вполне предостаточно для подавляющего большинства "нужд"


> конструкторы по умолчанию


> статические обьекты


да мало ли чего еще нет ! зато есть многое другое


 
Kurtevich   (2004-08-03 14:52) [73]


> Ну вот. Как всегда кривостьв  одном ищется в другом. И в
> фидо также. Еслия пишу криво, то надо переписать Дельфи
> нафик, полностью.

блин, ну причем тут что я криво пишу?... мне от этих "методов класса" или как вы их там называете ни холодно ни жарко в процессе программирования... блин, вы хоть думайте, что пишете! я ж ругаюсь не потому, что уменя что-то не работает! прочитайте все эти посты от начала, я ХОТЬ РАЗ сказал, что из-за нехорошей дельфи у меня прога не компилируется, БЛИН!!!??


 
Думкин ©   (2004-08-03 14:54) [74]

>  [73] Kurtevich   (03.08.04 14:52)

Я понимаю, и чел в фидо писал также. Но если проблем нет, то в чем они есть?


 
Kurtevich   (2004-08-03 14:55) [75]


> Паскаль-компилятор работает по однопроходной схеме, многие
> фичи иных языков в нем попросту нереализуемы

дык в данном случае это как раз фича ПАСКАЛЯ, которой НЕТ в других языках!


 
KSergey ©   (2004-08-03 14:57) [76]

Жаловался, что работает не так, как ожидал, а так, как ее скомпилировал поганый компилятор.

> конструкторы по умолчанию

А зачем они, если объякты всегда явно создаются в коде программы, в отличии от С++???

Вообще, надо понять важное отличие: в дельфи нет переменный-объектов. Есть только ссылки на объекты (читай - указатели).


 
Digitman ©   (2004-08-03 14:58) [77]


> Kurtevich   (03.08.04 14:55) [75]


> это как раз фича ПАСКАЛЯ


фича-то эта не на пустом месте растет !
фича эта накладывает определенные ограничения, которых не имеют некие иные языки и многопроходные компиляторы этих языков


 
Kurtevich   (2004-08-03 14:58) [78]


> Думкин ©   (03.08.04 14:54) [74]

я не чел в фидо, а если бы вы разобрались, о чем тут идет речь, то стало бы ясно: проблема всего-навсего в том, что я начал ругаться на дельфи за то, что она позволяет такую ФИЧУ, которую как типа-ООП-шная среда не должна бы позволять... и дело не в том, что от этого у меня винда глючит или кофе остывает, просто это... ну некрасиво, и всё тут! это все равно что трансвестит, когда ты думаешь что он девушка, а он на самом деле нет! :)


 
Anatoly Podgoretsky ©   (2004-08-03 15:00) [79]

Сказал, начиная с самого первого сообщения.

Типичный засланец.


 
Digitman ©   (2004-08-03 15:03) [80]


> позволяет такую ФИЧУ, которую как типа-ООП-шная среда не
> должна бы позволять


где ? где это регламентировано ? какими документами ?
твои собственные вокруг-да-около инсинуации - это не регламентирующий документ


 
Kurtevich   (2004-08-03 15:03) [81]


> KSergey ©   (03.08.04 14:57) [76]

важное отличие я прекрасно понимаю, и как раз им и недоволен!
зачем конструкторы по умолчанию?... щаз расскажу!
предположим я хочу создать класс TString, который бы инкапсулировал все возможности стринга, только работал бы скажем... с массивами чар. понятно, мне было бы неудобно постоянно вызывать конструкторы и деструкторы когда мне надо пользоваться переменными этого типа, и именно поэтому я и не могу так сделать в Дельфи! потому что она не вызывает автоматически конструкторы по умолчанию, и в ней нельзя иметь статические переменные типа класс - т.е. именно то, что в ООП называется обьектом. вот...


 
KSergey ©   (2004-08-03 15:05) [82]

> [81] Kurtevich   (03.08.04 15:03)

Еще раз объясняю: этого просто не предусмотрено. Однако функциональности это не ущемляет никоим образом.


 
Kurtevich   (2004-08-03 15:05) [83]

что это я
> Сказал, начиная с самого первого сообщения.
???? процитируй!
ругаться совсем необязательно, и обижаться тоже - мы не маленькие дети! (во всяком случае я надеюсь :))


 
Sandman25 ©   (2004-08-03 15:05) [84]

Мне все это напоминает ветку про

Button: TButton;

Button := TButton(TEdit.Create(nil));
if Button is TButton

Тоже жаловались, что компилятор слишком умный и некрасиво делает


 
Sergey Kaminski ©   (2004-08-03 15:06) [85]

Добрый дядя Борланд... Произносится с шутливым ужасом. Вроде: Добрый дяди Билл.... Что поделаешь:
 -- Жиды-с.


Kurtevich   (03.08.04 14:52) [73]
>  мне от этих "методов класса" или как вы их там называете ни холодно ни жарко в процессе программирования...

В этом тоже ДЯДЯ виноват?

Насоздаете объектов в одном месте, уничтожаете в другом, называете это тривиальным случаем... А потом дядя виноват, не важно в чем, в том, что Free "кривое" или в другом.


 
Sergey Kaminski ©   (2004-08-03 15:07) [86]

> Sandman25 ©   (03.08.04 15:05) [84]
Один к одному, точно :))


 
Kurtevich   (2004-08-03 15:08) [87]


> Еще раз объясняю: этого просто не предусмотрено. Однако
> функциональности это не ущемляет никоим образом

интересно, а тот самый пример, который я привел - это не ущемление функциональности? если в ООП-языке можно обьявить класс, а потом обращаться с ним как с простым типом данных, не думая ни о каких конструкторах - это ли не функциональность?


 
Digitman ©   (2004-08-03 15:08) [88]


> статические переменные типа класс .. в ООП называется обьектом


бред сивой кобылы


 
Kurtevich   (2004-08-03 15:10) [89]


> Kurtevich   (03.08.04 14:52) [73]
> >  мне от этих "методов класса" или как вы их там называете
> ни холодно ни жарко в процессе программирования...
>
> В этом тоже ДЯДЯ виноват?

а это что было? женская логика? обьясняю на пальцах: "ни холодно ни жарко" = "все равно"; кто здесь в чем виноват?


 
Digitman ©   (2004-08-03 15:11) [90]


> Kurtevich


дальнейшие прения по сабжу бессмысленны, пока ты не приведешь свое определение и понимание "статической переменной"


 
Sergey Kaminski ©   (2004-08-03 15:13) [91]

> Kurtevich   (03.08.04 15:10) [89]

Объясняю на пальцах:
Дядя не виноват, что вы не используете методы класса.


 
Sergey Kaminski ©   (2004-08-03 15:14) [92]

> Kurtevich   (03.08.04 15:10) [89]
А то, что именно вы используете, вы уже показали.


 
Игорь Шевченко ©   (2004-08-03 15:14) [93]


> это уже получается не метод, а просто глобальная
> процедура, которую зачем-то запихнули в обьвление класса!


Для статических и классовых методов - абсолютно верно.


 
Kurtevich   (2004-08-03 15:15) [94]


> Digitman ©   (03.08.04 15:08) [88]

где здесь бред сивой кобилы??? в том, что вы, ув. Digitman, не знаете что такое обьект??? обьсняю на пальцах основы ООП абстрагируясь от каких-бы-то-ни-было языков и средств:
КЛАСС = структурированный ТИП данных
ОБЪЕКТ = переменная типа КЛАСС
где здесь бред??? уже даже борланд отошол от object pascal и принял эту терминологию, за тем лишь исключением, что у них
ОБЪЕКТ = УКАЗАТЕЛЬ на переменную типа КЛАСС
блин, сколько можно гнать?... на фиг придираться к ками-то мелким словам? больше придраться не к чему?


 
Игорь Шевченко ©   (2004-08-03 15:18) [95]

В потрепаловку пора :)

Delphi - отстой и насилие над ООП.


 
Sergey Kaminski ©   (2004-08-03 15:19) [96]


> обьсняю на пальцах основы ООП


Это лучше Борланду "на пальцах" объясните, может он чего не понял


 
Игорь Шевченко ©   (2004-08-03 15:22) [97]


> если в ООП-языке можно обьявить класс, а потом обращаться
> с ним как с простым типом данных, не думая ни о каких конструкторах
> - это ли не функциональность?


Эт язык надо менять.
Я же не удивляюсь тому, что Delphi мне прогноз погоды не выдает при запуске, хотя не мешало бы...
Или препроцессора не имеет...


 
Sergey_Masloff   (2004-08-03 15:27) [98]

Игорь Шевченко ©   (03.08.04 15:18) [95]
>Delphi - отстой и насилие над ООП.
Не то слово. Я бы даже сказал аЦтой ;-)


 
Игорь Шевченко ©   (2004-08-03 15:30) [99]

Sergey_Masloff   (03.08.04 15:27) [98]

Я кажется понял - это такая форма агитации за C#. Охаивать другие языки.


 
Digitman ©   (2004-08-03 15:31) [100]


> Kurtevich   (03.08.04 15:15) [94]


бред конечно !

ООП как концепция вообще не дает никаких определений, как и где хранится реальный объект и какова его связь с какими-то там "переменными"

то что ты в CPP написал где-то строчку MYCLASS myobj, вовсе не означает, что obj - это именно статическая переменная и что размер этой переменной в памяти совпадает с размером структуры, определенной структурой класса MYCLASS

поэтому я и задал тебе вопрос - ЧТО есть, по твоему, статическая переменная типа КЛАСС ?


 
Kurtevich   (2004-08-03 15:33) [101]

ничего я не охиваю, ёпрст! да что вы все такие обидчивые? для вас Дельфи, это что - святыня какая-то? стоит только указать на какой-нибудь недостаток, тут же охаивать, агитация... вы меня еще вражеским агентом или террористом-маньяком назовите! никто вобще даже не понимает о чем речь идет, только плачутся, что их любимую дельфу аскарбили, аЦтоем обозвали!... короче, i"m outta here... всем спасибо за интересно убитый рабочий день :))


 
Digitman ©   (2004-08-03 15:36) [102]


> Kurtevich


ну что ж ты так позорно ретируешься-то ?
ответь уж на вопрос мой последний) .. он вовсе не про Делфи)


 
Игорь Шевченко ©   (2004-08-03 15:37) [103]


> никто вобще даже не понимает о чем речь идет


Ну почему же никто ? Все понятно, не первый случай на этом сайте :)


 
вразлет ©   (2004-08-03 15:39) [104]

Что -то снобов тут развелось...В реале за такой тон разговора вообще -то яйца отрывают. Сами себе не противны?


 
Игорь Шевченко ©   (2004-08-03 15:45) [105]

вразлет ©   (03.08.04 15:39) [104]

http://ln.com.ua/~openxs/articles/smart-questions-ru.html


> В реале за такой тон разговора вообще


Оторви себе и успокойся


 
вразлет ©   (2004-08-03 15:45) [106]

Игорь Шевченко ©

От локтя.


 
Kurtevich   (2004-08-03 15:46) [107]


> Digitman ©   (03.08.04 15:36) [102]

хм... на последний вопрос? ну разве что на последний... это на этот?

> ЧТО есть, по твоему, статическая переменная типа КЛАСС ?

что ж, признаюсь, я понятия не имею, что она реально из себя представляет, какой ее размер и так далее.... мне важно только то, что, как и любая другая статическая переменная, она автоматически создается и уничтожается в сфере своей видимости, и поэтому я могу использовать ее как переменную любого другого типа, хоть бы интеджер, совершенно не думая и может даже не ЗНАЯ, что это обьект! - а это и есть настоящее ООП! и дело не в том, что я трясусь, или у меня что-то не работает, просто это оччень удобно! вот и все!
особо оскорбленным желающим оторвать мне яйца большой привет! :) если бы я откладывал по рублю каждый раз, когда слышал подобное... :) whatever, всем удачи! :)


 
KSergey ©   (2004-08-03 15:49) [108]

> [101] Kurtevich   (03.08.04 15:33)
> стоит только
> указать на какой-нибудь недостаток,

Вы указываете не на недостатки.
Вы указываете на отсутствие тех приемов, к которым привыкли в других языках.
Что никак не связано с дельфи. НИКАК.
Да, вначале было некоторое недопонимание, вам разъяснили. Чего еще говорить-то?
Но если вы изучите Delphi Language нормально - то, поверьте, потом ьудете говорить "Эх, вот в дельфи это было так удобно...".
Так что немного лучше помолчите, обдумайте.
Вот и все. Говорить, вообще-то, уже не о чем.


 
Игорь Шевченко ©   (2004-08-03 15:55) [109]


> мне важно только то, что, как и любая другая статическая
> переменная, она автоматически создается и уничтожается в
> сфере своей видимости, и поэтому я могу использовать ее
> как переменную любого другого типа


В Delphi все объекты динамические. Хорошо это или плохо - судить не берусь, но это свойство языка. Не нравится - можно всегда перейти на другой язык.

Например, в Delphi нету множественного наследования, что тоже не всегда удобно, но это не повод говорить что Delphi изнасиловало ООП. Просто нету его, такого наследования. Ведь не удивляет тот факт, что в микроскоп неудобно на звезды смотреть, правда ?


 
DiamondShark ©   (2004-08-03 15:57) [110]

Это сериал? "IS возвращается"?


 
KSergey ©   (2004-08-03 15:57) [111]

> [109] Игорь Шевченко ©   (03.08.04 15:55)
> Ведь не удивляет тот факт, что в микроскоп неудобно на звезды
> смотреть, правда ?

Но возмущает!


 
Sergey Kaminski ©   (2004-08-03 16:02) [112]

> Это сериал? "IS возвращается"?

Однозначно. Только там яйца не рвали.


 
KSergey ©   (2004-08-03 16:03) [113]

> [112] Sergey Kaminski ©   (03.08.04 16:02)
> > Это сериал? "IS возвращается"?
>
> Однозначно. Только там яйца не рвали.

Ужас.. Что же будет в следующий раз??!!
Куда мир катится..  :((


 
Digitman ©   (2004-08-03 16:11) [114]


> Kurtevich   (03.08.04 15:46) [107]


вот теперь наконец-то видно, что ты откровенно плаваешь в понятиях статики и динамики ... и ни ООП ни языки здесь ни при чем .. ты попросту не представляешь себе действия компилятора/линкера, когда речь идет о статике или динамике

то что ты объявил где-то в подпрограмме идентификатор MYCLASS myobj, совершенно не означает, что переменная myobj есть статическая переменная

статической переменной является та переменная, память под которую выделяется статически, в секции данных, на этапе иниц-ции процесса.. время жизни статической переменной равно времени жизни процесса ..

память же под все прочие переменные выделяется уже в ран-тайм, в куче или в стеке (в зависимости от контекста объявления), поэтому такие переменные статическими НЕ являются, ВНЕ зависимости от того, какого они типа


 
noname_   (2004-08-03 16:20) [115]

Вопрос к Kurtevich как к ценителю и знатоку c++
есть c++ код

MyObject* a;
MyObject* b;
a = new MyObject;
b = a;
delete a;
test_exists(b);

что мне написать в функции test_exists чтобы узнать - существует передаваемый в нее объект или нет?


 
iZEN ©   (2004-08-03 22:58) [116]

/**Kurtevich   (03.08.04 14:20) [56]
на самом деле всё это совершенно неправильно, и если бы Страусструп был здесь, он бы такого бы не допустил!!! :)
нельзя вызывать методы класса без создания обьекта, это очень WRONG! это уже получается не метод, а просто глобальная процедура, которую зачем-то запихнули в обьвление класса!
*/

Тогда уж имеет смысл намекнуть создателям языка Java об их неправоте относительно одного из ключевых классов пакета java.lang
public final class Math extends Object,
в котором все методы - СТАТИЧЕСКИЕ, то есть методы класса, выражаясь терминами ObjectPascal.
Но только делайте это в мягкой форме, иначе пошлют...


 
iZEN ©   (2004-08-03 23:15) [117]

Похоже автор топика путает ссылки и объект.


 
Некрофил-затейник__   (2004-08-04 06:54) [118]

noname_
Delete высвобождает обьект

MyObject;<---Это то массив, класс, структура, void*,целое так обозвали?
конкретнее можно?
а еще лучше обьясни что делает эта функция в Дельфи?

var
return:boolean;
begin
if(NoError)then
 begin
  Make;
  Fill;
  Clear;
  SetTransactions;
  Repaint;
  return := true;
 end
else
 begin  
  MakeKorection(x);
  return := false;
  MessageBox("error","Change user",0,0);  
 end;
 Result := return;
end;


 
Некрофил-затейник__   (2004-08-04 07:01) [119]

Kurtevich  
imho
Дельфи это священная корова/*на этом форуме во всяком случае*/
по мойму это еще с 199х годов пошло когда еще на дельфе ничего
особо не делалось все делалось на с но дельфины в столь юном
возврасте во всю пытались доказать что с отстой у них получилось
навязать стереотип и любой выпад в сторону дельфи считают
личным оскорблением вот и матерятся ....

noname_  
Кстати MyObject опиши конструктор и деструктор если это класс


 
noname_   (2004-08-04 09:30) [120]

2 Некрофил-затейник__
MyObject это класс.

Компилирующийся пример:

class MyObject
{
 int f;
};

bool test_exists(MyObject* t)
{
 return false;
}

int main()
{
 MyObject* a;
 MyObject* b;
 bool e;
 a = new MyObject;
 b = a;
 delete a;
 e = test_exists(b);
}

Что нужно написать в test_exists вместо "return false" чтобы функция возвращала true если объект t существует и false если он разрушен?


 
Мастер ©   (2004-08-04 09:34) [121]

Вот погодите, Куртевич вернется, он вам всем покажет, где раки зимуют.


 
Некрофил-затейник__   (2004-08-04 09:35) [122]

noname_  
что нужно вписать в обьявление класа что бы он уничтожался?
ДЕСТРУКТОР ГДЕ?


 
Игорь Шевченко ©   (2004-08-04 10:07) [123]


> ДЕСТРУКТОР ГДЕ?


В книжках по программированию. Читай и воздастся тебе.


 
Юрий Зотов ©   (2004-08-04 10:17) [124]

Просто наблюдение.

Много раз слышал, как ругают Delphi и за то, и за се, отстой, масдай, инструмент для ламеров - и прочая, и прочая.

И каждый раз из слов ругающего вытекало одно и то же - что он просто-напросто не знает Delphi. Соответственно, и не понимает, а что же это такое.

То есть, человек пытается оценивать то, о чем не имеет сколько-нибудь серьезного понятия. Ну, примерно, как я бы взялся судить матч боксеров-профессионалов.

Видимо, безграмотно судить о Delphi, безопаснее, чем боксеров - вот и лезут дилетанты в эксперты. А от людей, которые действительно знают и понимают, что такое Delphi (включая и приверженцев Си) я еще ни разу не слышал ругани в ее адрес. Критику - да слышал. Но по делу, в спокойном тоне, и без всяких масдаев-отстоев.

Г-н Kurtevich, Вы не подскажете мне, как программисты называют воинствующих невежд? Слово такое у них есть, специальное...


 
вразлет ©   (2004-08-04 10:22) [125]

Юрий Зотов ©

То есть, человек пытается оценивать то, о чем не имеет сколько-нибудь серьезного понятия. Ну, примерно, как я бы взялся судить матч боксеров-профессионалов.


Это когда Вы перепутали братьев Кличко?)


 
Юрий Зотов ©   (2004-08-04 10:26) [126]

> вразлет ©   (04.08.04 10:22) [125]

Было такое. Сламерствовал. Что и признал в итоге. Так ведь?


 
вразлет ©   (2004-08-04 10:29) [127]

Юрий Зотов ©

Воистину)


 
Anatoly Podgoretsky ©   (2004-08-04 10:31) [128]

Юрий Зотов ©   (04.08.04 10:26) [126]
Теперь тебе Кличко пожизненно :-)


 
Sandman25 ©   (2004-08-04 10:32) [129]

[128] Anatoly Podgoretsky ©   (04.08.04 10:31)

Хорошо, что не Ламер :)


 
Яод   (2004-08-04 10:39) [130]

Kurtevich  
Напиши свою среду, где менеджер памяти будет отслеживать все переменные, ссылающиеся на ячейки памяти и соответсвенно инициализировать и очищать правильно и тогда посмотрим, где еще тот гемморой


 
KSergey ©   (2004-08-04 11:00) [131]

> [122] Некрофил-затейник__   (04.08.04 09:35)
> что нужно вписать в обьявление класа что бы он уничтожался?

Ничего.

> ДЕСТРУКТОР ГДЕ?

Зачем он здесь? Явный деструктор?


 
Игорь Шевченко ©   (2004-08-04 11:13) [132]

Яод   (04.08.04 10:39) [130]


> Напиши свою среду, где менеджер памяти будет отслеживать
> все переменные, ссылающиеся на ячейки памяти и соответсвенно
> инициализировать и очищать правильно и тогда посмотрим,
> где еще тот гемморой


Уже все давно написано.


 
Igorek ©   (2004-08-04 12:06) [133]

Влом читать всю ветку. Я напр. не понимаю, какой смысл оставлять возможность существования битых ссылок.
Обьясните мне, когда нужна битая ссылка?
Если никогда, то и метод Free юзеру не нужен. Пусть бы его спрятали и выставили только FreeAndNil.

---
Сам я никогда Free не использую - только FreeAndNil.


 
Sandman25 ©   (2004-08-04 12:08) [134]

[133] Igorek ©   (04.08.04 12:06)

1. Зачем обнулять локальную ссылку?
2. А если я не храню ссылки на объекты?


 
noname_   (2004-08-04 12:27) [135]

2 Igorek
FreeAndNil обнулит только одну ссылку, что делать если на один объект ссылается несколько переменных?


 
Igorek ©   (2004-08-04 12:45) [136]


> Sandman25 ©   (04.08.04 12:08) [134]
> [133] Igorek ©   (04.08.04 12:06)
>
> 1. Зачем обнулять локальную ссылку?
> 2. А если я не храню ссылки на объекты?

Эти вопросы не являются ответами по сути на поставленный вопрос. Это ответы на вопрос "когда не надо обнулять ссылку?".
На самом деле обнуление занимает децл времени.
И если не будет Free, то имеем:
+ почти невозможно создать битую ссылку
- незначительное замедление

Плюс намного больше минуса по абс. величине.

> noname_   (04.08.04 12:27) [135]
> 2 Igorek
> FreeAndNil обнулит только одну ссылку, что делать если на
> один объект ссылается несколько переменных?

Ну да, тут FreeAndNil не поможет. Он и не может помочь во всех случаях. В приведенном случае можно рекоммендовать стандартную двустороннюю связку - все ссылки на обьект напр. содержатся в классах, перед удалением все связки обрываются и ссылки обнуляются.


 
cyborg ©   (2004-08-04 12:48) [137]

Mov EAX,ECX

Объясните, зачем мне нужно перемещать данные из регистра в регистр, если в регистре EAX может быть выжная информация? Нафиг ещё какой-то PUSH делать, а потом ещё и POP, ламеризм какой-то, если мне надо всего лишь в регистр перегнать данные? Ассамблер для ламеров!


 
Sandman25 ©   (2004-08-04 12:49) [138]

[136] Igorek ©   (04.08.04 12:45)

Плюса нет, если в нужным местах пользоваться FreeAndNil.
Минус остается.


 
KSergey ©   (2004-08-04 12:50) [139]

> [136] Igorek ©   (04.08.04 12:45)

Читай
а) всю ветку, а то рискуешь попасть в клоуны наравне с автором
б) до посинения [120] noname_   (04.08.04 09:30), пока не поймешь, что это бред и н соответствует истине:

> И если не будет Free, то имеем:
> + почти невозможно создать битую ссылку


 
Игорь Шевченко ©   (2004-08-04 12:51) [140]


> Сам я никогда Free не использую - только FreeAndNil.


Никогда не говори "никогда"


 
Anatoly Podgoretsky ©   (2004-08-04 13:31) [141]

Igorek ©   (04.08.04 12:06) [133]
FreeAndNil Борланд ввела для ламеров, пошла даже на нарушение строгой типизации.


 
Юрий Зотов ©   (2004-08-04 13:55) [142]

> Igorek ©   (04.08.04 12:06) [133]

> Обьясните мне, когда нужна битая ссылка?

Никогда, естественно.

> Если никогда, то и метод Free юзеру не нужен. Пусть бы его
> спрятали и выставили только FreeAndNil.

Например, существует вот такая часто используемая конструкция:

with TMyObject.Create do
try
 ...
finally
 Free
end;

И как здесь уничтожит объект, если нет Free, а есть только FreeAndNil? Что передавать в параметре?

А вообще, программист просто обязан САМ следить за корректностью своих ссылок. Неважно, относятся ли они к объектам, или к чему-либо еще. Культуру кодинга и правила работы с динамической памятью еще никто не отменял, и Delphi - не исключение.


 
Anatoly Podgoretsky ©   (2004-08-04 13:58) [143]

Юрий Зотов ©   (04.08.04 13:55) [142]
Про [141] рассказывал кто то из TeamB, это из того что мол за хрень это Free, не обнуляет гад ссылки и еще и AV вызывает


 
Sergey Kaminski ©   (2004-08-04 14:03) [144]

Anatoly Podgoretsky ©   (04.08.04 13:58) [143]
не обнуляет гад ссылки и еще и AV вызывает

ничто не ново... :)


 
KSergey ©   (2004-08-04 14:08) [145]

> [143] Anatoly Podgoretsky ©   (04.08.04 13:58)

Можно было написать и по-китайски.
Я бы понял не больше.


 
noname_   (2004-08-04 14:29) [146]

по поводу конструкции TObject(nil).Free не дающей покоя автору ветки, сейчас проверил

#include <stdio.h>

class c1
{
 public:
 void DoSomething(void)
 {
   printf("something\n");
 };
};

int main()
{
 ((c1*)NULL)->DoSomething();
}

печатает "something" сообщений об ошибке не выдает, Delphi в данном случае ничем от C++ не отличается


 
Игорь Шевченко ©   (2004-08-04 14:33) [147]


> печатает "something" сообщений об ошибке не выдает


Неверно спроектированный класс, кстати, метод абсолютно лишний :))


 
Igorek ©   (2004-08-04 15:25) [148]

Вот пример организации двусторонней связи между классами:

procedure TamcBar.SetBarControl(const Value: TamcBarControl);
var
 TmpBarControl: TamcBarControl;
begin
 if FBarControl = Value then
   Exit;
 if FBarControl <> nil then
 begin
   TmpBarControl := FBarControl;
   FBarControl := nil;
   TmpBarControl.Bar := nil;
 end;
 FBarControl := Value;
 if FBarControl <> nil then
   FBarControl.Bar := Self;
end;


Защищает от битых ссылок.


 
Юрий Зотов ©   (2004-08-04 15:35) [149]

> Igorek ©   (04.08.04 15:25) [148]

Гм... а что здесь нового? Голимый стандарт. Механизм которого, кстати, встроен в VCL начиная с TComponent (Notification, FreeNotification, RemoveFreeNotification).

Кстати, а зачем так запутывать код? Какие-то Tmp... к чему они?

procedure TamcBar.SetBarControl(const Value: TamcBarControl);
begin
if FBarControl = Value then
  Exit;
if FBarControl <> nil then
  FBarControl.Bar := nil;
FBarControl := Value;
if FBarControl <> nil then
  FBarControl.Bar := Self
end;


 
Игорь Шевченко ©   (2004-08-04 15:37) [150]


> Защищает от битых ссылок


Каким образом, что-то я не очень понял...Если Value является битой ссылкой, то в 15-ой строке может возникнуть AV


 
UK   (2004-08-04 15:42) [151]

>Юрий Зотов ©   (04.08.04 13:55) [142]
with TMyObject.Create do
try
...
finally
Free
end;

Имхо, неудачный пример. Не нужен здесь Free, достаточно Destroy.


 
Игорь Шевченко ©   (2004-08-04 15:45) [152]

UK   (04.08.04 15:42) [151]

"It is not recommended coding style to call Destroy directly. Call Free instead. Free checks to ensure that the object reference is not nil before calling Destroy."

В данном случае мы догматики :)


 
Digitman ©   (2004-08-04 15:51) [153]


> cyborg ©   (04.08.04 12:48) [137]
> Mov EAX,ECX
>
> Объясните, зачем мне нужно перемещать данные из регистра
> в регистр, если в регистре EAX может быть выжная информация?
> Нафиг ещё какой-то PUSH делать, а потом ещё и POP, ламеризм
> какой-то, если мне надо всего лишь в регистр перегнать данные?


это ты к чему ? откуда у этого ноги растут ?


 
wicked ©   (2004-08-04 15:52) [154]

единственной защитой от битых ссылок может быть либо garbage collector, либо подсчет ссылок, как с динамическими строками...
поправьте меня, если не так.... :)
кстати, интересная тема... может ветку завести?....


 
Мастер ©   (2004-08-04 15:52) [155]

>UK   (04.08.04 15:42) [151]
И чем же пример неудачен?


 
Igorek ©   (2004-08-04 15:55) [156]


> Юрий Зотов ©   (04.08.04 15:35) [149]
> > Igorek ©   (04.08.04 15:25) [148]
>
> Гм... а что здесь нового? Голимый стандарт.

Да ничего наверно нового нету.
Да, и не идет вам этот тон. Юношеский максимализм, против которого вы боретесь. Вы же консерватор-ортодокс. :-))

> Кстати, а зачем так запутывать код? Какие-то Tmp... к чему
> они?

Что бы не было зацикливания рекурсивных вызовов - на той стороне такой же код.

> Игорь Шевченко ©   (04.08.04 15:37) [150]
> Каким образом, что-то я не очень понял...Если Value является
> битой ссылкой, то в 15-ой строке может возникнуть AV

Все обращения к классу идут из классов, связанных таким образом. Потому не может быть обращения извне и потому битых ссылок.


 
UK   (2004-08-04 16:02) [157]

>Игорь Шевченко ©   (04.08.04 15:37) [150]
>В данном случае мы догматики :)

Да я, честно говоря, тоже, пишу Free автоматически:)

>Мастер ©   (04.08.04 15:52) [155]

Написал же: > Не нужен здесь Free, достаточно Destroy
Что не так?


 
Игорь Шевченко ©   (2004-08-04 16:04) [158]


> Все обращения к классу идут из классов, связанных таким
> образом. Потому не может быть обращения извне и потому битых
> ссылок.


А без таких вот строк кода разве нельзя сделать программу, в которой не будет битых ссылок ? От кого тогда защищаться-то ?


 
Мастер ©   (2004-08-04 16:06) [159]

>UK   (04.08.04 16:02) [157]

Написал же: > Не нужен здесь Free, достаточно Destroy

Достаточно, это означает правильно и так нужно делать?


 
Anatoly Podgoretsky ©   (2004-08-04 16:11) [160]

UK   (04.08.04 16:02) [157]
А работу Free будешь сам выполнять? А зачем?


 
UK   (2004-08-04 16:20) [161]

>Anatoly Podgoretsky ©   (04.08.04 16:11) [160]

Не понял, какая такая работа в данном коде требуется от Free?
with TMyObject.Create do
try
...
finally
Free
end;
Что Self <> nil? Так по-другому здесь и быть не может. Вы о чем?

>Мастер ©   (04.08.04 16:06) [159]
>Достаточно, это означает правильно
Да.
>и так нужно делать?
Так можно делать и никогда ни к каким ошибкам это не приведет.


 
Anatoly Podgoretsky ©   (2004-08-04 16:23) [162]

А в другом месте, без анонимной ссылкой?


 
Мастер ©   (2004-08-04 16:30) [163]

> UK   (04.08.04 16:20) [161]

Ну что же...

Все на борьбу с лишними командами!
Будем вычленять из VCL необходимо-достаточные куски кода, и, в соответствии с ситуацией, использовать только их.


 
Sandman25 ©   (2004-08-04 16:33) [164]

[163] Мастер ©   (04.08.04 16:30)

И что в этом плохого? В том, что код понимается, а не бездумно используется.


 
UK   (2004-08-04 16:42) [165]

>Anatoly Podgoretsky ©   (04.08.04 16:23) [162]
При чем здесь другое место, когда речь шла о вполне конкретном примере?

>Мастер ©   (04.08.04 16:30) [163]

Ну если больше нечем заняться, то боритесь. Или это способ вести дискуссию, когда по существу сказать уже нечего?

Я что-то не понял... Я что, сказал что-то неправильно? Что именно? В чем меня пытаются обвинить? Или здесь теперь так принято?


 
Мастер ©   (2004-08-04 16:43) [166]

>Sandman25 ©   (04.08.04 16:33) [164]

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


А плохое то, что, даже если ты понял, что происходит в код VCL, не факт, что не допустишь ошибки. Также может изменииться код VCL при смене версии.

А в данном случае непонятна цель использования Destroy вместо Free.
Уменьшение кода на 5 байт? - Смешно, если учесть, что Destroy безопасно можно использовать только в приведенном примере.


 
Sandman25 ©   (2004-08-04 16:45) [167]

[166] Мастер ©   (04.08.04 16:43)

А давайте не будем inherited вызывать, вдруг код изменится при смене VCL.


 
Мастер ©   (2004-08-04 16:47) [168]

>Sandman25 ©   (04.08.04 16:45) [167]

Это предложение кочевряжить внутреннюю структуру классов?

inherited как раз и предназначено для того, чтобы правильно использвать методы предка.


 
Sandman25 ©   (2004-08-04 16:48) [169]

[168] Мастер ©   (04.08.04 16:47)

Free как раз и предназначено, чтобы правильно вызывать Destroy. И ни для чего больше.


 
Мастер ©   (2004-08-04 16:50) [170]

>Sandman25 ©   (04.08.04 16:48) [169]

> Free как раз и предназначено, чтобы правильно вызывать Destroy.
> И ни для чего больше.


Ну тогда о чем спорим?

Вызываем Free, чтобы правильно выполнилось Destroy.


 
Sandman25 ©   (2004-08-04 16:52) [171]

[170] Мастер ©   (04.08.04 16:50)

procedure ProcessIfNotZero(I: byte);
begin
 if I <> 0 then
   Process(I);
end;

...
I := 1;
ProcessIfNotZero(I);

Вопрос. Почему бы не вызвать Process(I), если код ProcessIfNotYero никогда не изменится?


 
Мастер ©   (2004-08-04 16:57) [172]

>Sandman25 ©   (04.08.04 16:52) [171]


> Вопрос. Почему бы не вызвать Process(I), если код ProcessIfNotYero
> никогда не изменится?


Потому, что используя в десятках мест Process(I), в конце концов получишь AV(в лучшем случае), упустив место, где I изменится(А приведенный пример вообще некорректен, так как не зависит от внешних условий).

Такой стиль программирования - не лучший.


 
UK   (2004-08-04 17:00) [173]

>Мастер ©   (04.08.04 16:47) [166]

С чего все началось:
Например, существует вот такая часто используемая конструкция:

with TMyObject.Create do
try
...
finally
Free
end;

И как здесь уничтожит объект, если нет Free, а есть только FreeAndNil? Что передавать в параметре?


Я высказал свое скромное мнение(Имхо), что ЭТОТ пример неудачен для обоснования необходимости наличия метода Free по таким-то причинах.

Как продолжилось:
Мастер ©   (04.08.04 15:52) [155]
>UK   (04.08.04 15:42) [151]
И чем же пример неудачен?


Я повторил, чем же именно этот пример неудачен в ДАННОМ случае.

Уважаемый, Вы вообще-то нить отслеживаете? При чем здесь борьба, куски VCL и прочие ужасы? Вы о чем вообще? Или так, для самоутверждения?


 
Sandman25 ©   (2004-08-04 17:02) [174]

[172] Мастер ©   (04.08.04 16:57)

А если я полностью контролирую свою программу и ничего не упущу? :)

Кстати, я всегда пишу по привычке Free, но если подумать, то применение Destroy вместо Free может сделать код более читабельным. Да, да! Как комментарий о том, что имеем дело с локальной переменной, которая нигде больше не используется.


 
Sandman25 ©   (2004-08-04 17:03) [175]

И которая точно не равна nil.


 
Мастер ©   (2004-08-04 17:04) [176]

>UK   (04.08.04 17:00) [173]

При чем здесь борьба, куски VCL и прочие ужасы? Вы о чем вообще? Или так, для самоутверждения?

Для чего вообще здесь было указано, что можно использовать Destroy? Для самоутверждения?

Ведь в контексте разговора совершенно не имеет значения, Destroy или Free используется. Смысл был в том, что невозможно использовать FreeAndNil в такой конструкции.

В результате это абсолютно ненужное, и даже вредное замечание увело дискуссию в сторону.


 
Sandman25 ©   (2004-08-04 17:05) [177]

[176] Мастер ©   (04.08.04 17:04)

Правильно, даешь процедуру DestroyAndNil!


 
Мастер ©   (2004-08-04 17:07) [178]

>Sandman25 ©   (04.08.04 17:02) [174]


> применение Destroy вместо Free может сделать код более читабельным


А вот это субъективное утверждение.

А если я полностью контролирую свою программу и ничего не упущу? :)

А если для корректировки объемной программы нужно будет вернуться к коду через полгода-год?

Ведь здесь дело в стиле, этот пример слишком прост, чтобы в нем можно было допустить ошибки.


 
Sandman25 ©   (2004-08-04 17:10) [179]

[178] Мастер ©   (04.08.04 17:07)

Если пример сложнее, то используется Free :)


 
UK   (2004-08-04 17:11) [180]

>Мастер ©   (04.08.04 17:04) [176]
>абсолютно ненужное, и даже вредное замечание.

А, понял. Врага народа нашли, хватай его - и на Соловки!
К ВАМ у меня больше вопросов нет, позвольте откланяться. Позвольте на прощание совет - потренируйте на досуге формальную логику, у Вас с ней проблемы.


 
Мастер ©   (2004-08-04 17:12) [181]

>UK   (04.08.04 17:11) [180]

ага-)

Вот он каков - Ваш метод ведения дискуссии - демагогия.


 
Мастер ©   (2004-08-04 17:15) [182]

> Sandman25 ©   (04.08.04 17:10) [179]

> Если пример сложнее, то используется Free :)


К чему и вернулись;-)


 
Sandman25 ©   (2004-08-04 17:17) [183]

[182] Мастер ©   (04.08.04 17:15)

Конечно, вернулись. Но, надеюсь, иногда Вы осмелитесь написать Destroy вместо Free :)


 
Мастер ©   (2004-08-04 17:19) [184]

>Sandman25 ©   (04.08.04 17:17) [183]

Конечно, вернулись. Но, надеюсь, иногда Вы осмелитесь написать Destroy вместо Free :)

Так не вижу смысла в этом.
для меня намного привычней и наглядней написать Free - так, как это я использую везде в программе. А задумываться еще и о том, можно ли в данном конкретном случае сэкономить одну команду - только время терять при разработке.


 
Anatoly Podgoretsky ©   (2004-08-04 17:19) [185]

Мастер ©   (04.08.04 17:04) [176]
Особо не увело, свою роль тоже сыграло.


 
Sandman25 ©   (2004-08-04 17:20) [186]

[184] Мастер ©   (04.08.04 17:19)

С последней частью согласен.


 
Igorek ©   (2004-08-04 17:38) [187]


> Игорь Шевченко ©   (04.08.04 16:04) [158]
> > Все обращения к классу идут из классов, связанных таким
> > образом. Потому не может быть обращения извне и потому
> битых
> > ссылок.
> А без таких вот строк кода разве нельзя сделать программу,
> в которой не будет битых ссылок ? От кого тогда защищаться-то
> ?

Что за манера - вопросом на вопрос.
Ты спросил - "как защищает?". Я пояснил. Не забывай, что в начале я написал "это пример". Могут быть и другие способы - с другими строками кода.
Просто именно такой код (или измененный, если есть список ссылок) позволяет:
- разрывать связь с любой стороны и даже извне
- будучи вызванным в деструкторе автоматом обрежет связи на класс, что разрушается

Что в конечном итоге делает невозможным битые ссылки. И делает это легко - т.е. раз написал связь - и ни о чем не беспокоишься.


 
NailMan ©   (2004-08-04 18:44) [188]

Anatoly Podgoretsky ©

> Проверка переменной на нил говорит о попытке повторного
> использования этой переменной, в правильно написаной программе
> этого быть не должно, говорит о недостатках дизайна, подлежит
> переписыванию.

Не соглашусь. Предположим у меня есть массив чего-то, скажем массив текстур которые сделаны в виде класса.

Я загрузил в начале программы кучу текстур, и по прошествии какого-то времени мне стала не нужна какая-то текстура в массиве.
Я ее Free-кнул, тобишь убил.

Далее прошло еще какое-то врем и я решил загрузить текстуру, которой в массиве нет еще и чтобы не расширять массив я хочу найти свободный указатель.
Я буду проверять if Texture[i]<>nil then я создам ее и буду юзать дальше.

Другими словами я найду первый свободный элемент и займу его, но не буду расширять сам массив добавляя ему в конец новый экземпляр.

Ну и как тут передизайнить по правильному?

---
WBR, NailMan aka 2:5020/3337.13


 
wicked ©   (2004-08-04 18:48) [189]


> Ну и как тут передизайнить по правильному?

к

> Я ее Free-кнул, тобишь убил.

нужно добавить - "и об-nil-ил"....
и всех делов... тем более, что класс-контейнер сам должен инкапсулировать такие вещи...


 
Igorek ©   (2004-08-04 19:22) [190]


> Другими словами я найду первый свободный элемент и займу
> его, но не буду расширять сам массив добавляя ему в конец
> новый экземпляр.
> Ну и как тут передизайнить по правильному?

связный список тебе поможет


 
Anatoly Podgoretsky ©   (2004-08-04 19:57) [191]

NailMan ©   (04.08.04 18:44) [188]
TList/TObjectList


 
Anatoly Podgoretsky ©   (2004-08-04 19:58) [192]

Поиск элемента (переменной) и есть попытка повторного использования, ведет к ошибкам.


 
cyborg ©   (2004-08-04 20:29) [193]


>  [153] Digitman ©   (04.08.04 15:51)
> это ты к чему ? откуда у этого ноги растут ?

Это я к первому сообщению, хотел сказать "ты программист или где?", но потом написал это, так понятнее :). Если человеку лень обнулять указатели это не значит что их не нужно обнулять. Напиши в конце концов процедуру, которая освобождает и обнуляет, но его это почему-то вымораживает. Пошёл бы он скворечник сострогал чтоли, тут птицам размножаться негде :).



Страницы: 1 2 3 4 5 вся ветка

Текущий архив: 2004.08.22;
Скачать: CL | DM;

Наверх




Память: 1.04 MB
Время: 0.028 c
14-1091217873
Cheater
2004-07-31 00:04
2004.08.22
LOL


1-1091795371
NailMan
2004-08-06 16:29
2004.08.22
Чем можно графики отображать?


3-1091195736
Koala
2004-07-30 17:55
2004.08.22
Активные подключения


10-1030551543
kavlad
2002-08-28 20:19
2004.08.22
CORBA-сервер, возвращающий файл.


3-1090899132
тихий вовочка
2004-07-27 07:32
2004.08.22
Обновление