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

Вниз

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

 
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 будешь сам выполнять? А зачем?



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

Форум: "Потрепаться";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.81 MB
Время: 0.065 c
6-1087400582
Vvedensk
2004-06-16 19:43
2004.08.22
Трасировка из дельфи


11-1079627508
RA
2004-03-18 19:31
2004.08.22
Приоритеты в КОЛ


3-1090833619
hursand
2004-07-26 13:20
2004.08.22
dbgrid


3-1091430919
P_Aleks
2004-08-02 11:15
2004.08.22
Обрезание строки до 256 символов (bde?) при получении её с севера


14-1091355954
dimon_programmer
2004-08-01 14:25
2004.08.22
Как достать темы для XP, подскажите!





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский