Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 1.01 MB
Время: 0.054 c
1-1091775769
doodle
2004-08-06 11:02
2004.08.22
Как создать фаил и поменять дату его создания на месяц назад?


3-1091415001
r00t
2004-08-02 06:50
2004.08.22
Data Type в XML Table


1-1092058473
Вопрос
2004-08-09 17:34
2004.08.22
Оптимизация кода


6-1088076333
студентМАИ
2004-06-24 15:25
2004.08.22
служба доступа к файлам и принтерам


14-1091513884
Narat
2004-08-03 10:18
2004.08.22
RX components for Delphi 8





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский