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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.83 MB
Время: 0.04 c
1-1091807061
Spike
2004-08-06 19:44
2004.08.22
Подскажите, как скопировать в Clipboar русский текст...


3-1091078186
Wolfram
2004-07-29 09:16
2004.08.22
Ошибка с полем дата/время в аксес


1-1091712247
AlexeyITN
2004-08-05 17:24
2004.08.22
Не меняется Button1.Font.Color Почему?


1-1091801436
Леонид Федьков
2004-08-06 18:10
2004.08.22
Передача HTML-страницы в TWebBrowser через TOleStream


4-1089289927
Elysium
2004-07-08 16:32
2004.08.22
Таймер на 6 миллисекунд