Форум: "Потрепаться";
Текущий архив: 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