Форум: "Прочее";
Текущий архив: 2013.10.13;
Скачать: [xml.tar.bz2];
ВнизПроблема с указателем. Найти похожие ветки
← →
О-Сознание (2013-05-03 18:39) [0]При нажатии на кнопку происходит AV,
при этом делается FreeAndNil и проверка на Assigned.
type
TX = class
Text: string;
end;
var
X: TX;
Y: TX;
procedure TForm1.FormCreate(Sender: TObject);
begin
X := TX.Create;
X.Text:= "Dummy";
Y:= X;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FreeAndNil(X);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
FreeAndNil(X);
If Assigned(Y) then
begin
Caption:= Y.Text;
end;
end;
В чем дело?
И как правильно уничтожить X, чтобы Y знал об этом.
← →
brother © (2013-05-03 18:43) [1]> If Assigned(Y)
if y <> nil
где создание y?
← →
clickmaker © (2013-05-03 18:45) [2]TX.BeforeDestruction
← →
О-Сознание (2013-05-03 18:46) [3]
> brother © (03.05.13 18:43) [1]
>
> > If Assigned(Y)
>
> if y <> nil
> где создание y?
Y - это указатель.
> clickmaker © (03.05.13 18:45) [2]
>
> TX.BeforeDestruction
В смысле?
← →
brother © (2013-05-03 18:47) [4]> TX.BeforeDestruction
и поднять флаг об уничтожении в TY
← →
brother © (2013-05-03 18:48) [5]> Y - это указатель.
мдя... ладна, и что?
← →
О-Сознание (2013-05-03 18:51) [6]
> brother © (03.05.13 18:48) [5]
>
> > Y - это указатель.
>
> мдя... ладна, и что?
Ок.
Ваше решение?
← →
О-Сознание (2013-05-03 18:53) [7]
> brother © (03.05.13 18:43) [1]
> где создание y?
Всё равно произойдёт AV.
← →
brother © (2013-05-03 18:54) [8]ты не ответил на [1], а пытать тебя я не буду...
← →
О-Сознание (2013-05-03 18:56) [9]
> brother © (03.05.13 18:54) [8]
>
> ты не ответил на [1], а пытать тебя я не буду...
> if y <> nil
Тоже самое делает Assigned.
> где создание y?
Ничего не даст.
Я на всё ответил.
← →
Anatoly Podgoretsky © (2013-05-03 18:58) [10]Создание не нужно Y:= X; а использоваться должно Assigned(X) а не Y
Сообственно и сам Y не нужен, ну разве чтобы допускать ошибки.
И правильно так
procedure TForm1.Button1Click(Sender: TObject);
begin
FreeAndNil(X);
end;
← →
brother © (2013-05-03 19:03) [11]> Y:= X;
не заметил...
> Y:= X;
не создает копию объекта а только ссылку на на него...
> procedure TForm1.Button1Click(Sender: TObject);
> begin
> FreeAndNil(X); убиваем обект родитель и y ссылается на мусор
>
> If Assigned(Y) then проходит, но по адресу мусор значит AV
> begin
> Caption:= Y.Text;
>
> end;
> end;
ты не можешь полноправно работать с объектом если убил его отца...
← →
brother © (2013-05-03 19:05) [12]я если честно не понял идеи, зачем Y:= X; если имеем полноценный X?
тебе нужна копия объекта X?
← →
clickmaker © (2013-05-03 19:08) [13]механизм подсчета ссылок, как в InterfacedObject
← →
brother © (2013-05-03 19:08) [14]вообще ты должен был сделать так, дабы не ловить AV :
FreeAndNil(X);
Y:= nil;
If Assigned(Y) then
begin
тк
ты вызвался сам следить за Y когда написал
> Y:= X;
← →
картман © (2013-05-03 20:48) [15]
> О-Сознание (03.05.13 18:46) [3]
>
>
> > brother © (03.05.13 18:43) [1]
> >
> > > If Assigned(Y)
> >
> > if y <> nil
> > где создание y?
>
>
> Y - это указатель.
ну так и сделай его указателем:
var
X: TX;
Y: ^TX;
...
Y := @X;
...
if Assigned(Y^) then
...
только вот зачем такое городить?
← →
brother © (2013-05-03 20:50) [16]видимо хочет [12]
← →
NoUser © (2013-05-04 01:13) [17]О-Сознание, а Вы к нам с какой Си или Ява галактики прилетели - так будет легче Вам розового масла для ремонта подыскать - взбудоражили тут честных мастеров.
← →
Inovet © (2013-05-04 05:21) [18]> [17] NoUser © (04.05.13 01:13)
> а Вы к нам с какой Си или Ява галактики прилетели
А что, в галактике Си принято по несколько указателей создавать?
← →
Dimka Maslov © (2013-05-04 10:24) [19]Правильно так не делать вообще. Если мы не ведём подсчёт ссылок, мы обязаны самостоятельно контролировать время жизни объектов и не плодить на них ссылки. Можно ещё придумать некое глобальное хранилище объектов (массив указателей), и плодить лишь ссылки на элементы этого массива.
← →
Holly warrior (2013-05-04 12:21) [20]>А что, в галактике Си принято по несколько указателей создавать?
В галактике Си принято насоздавать кучу непонятных указателей, в которых потом нереально разобраться. Код пестрит от указаталей на указатели на указатели на указатели.
Недавно знакомый переписывал с сей реализацию одного алгоритма для астрономии. Говорит - код стал сильно прозрачнее, между делом нашел несколько ошибок, работает где-то на 15% быстрее. Си - не нужен.
← →
Holly warrior (2013-05-04 12:23) [21]>Правильно так не делать вообще.
+1.
← →
Inovet © (2013-05-04 12:27) [22]> [20] Holly warrior (04.05.13 12:21)
> Код пестрит от указаталей на указатели на указатели на указатели
Это не то же самое, что два аналогичных. Ну а пестрит, так написали так.
← →
Аббат Пиккола (2013-05-04 13:13) [23]
Y:= X;
И как правильно уничтожить X, чтобы Y знал об этом.
try
Caption:= Y.Text;
except
ShowMessage("Я знаю, что меня уже нет. С уважением, Y")
end;
← →
Аббат Пиккола (2013-05-04 13:21) [24]Впрочем, если без шуток, то мне непонятен сам вопрос сабжа.
Допустим, у меня есть такой код. Причем. неважно, на каком языке программирования он написан.
A := 10; //присваиваю переменной A значение 10
B := A; //копирую значение переменной A в переменную B
A := 5; //теперь изменяю значение переменной A
Print(B); //фигею, какого черта в переменной B значение автоматически не изменилось ????????????????????????!!!!!!!!!!!!!!!!!!!!!!!!
И я спрашиваю у уважаемой публики:
"Как сдалать так, чтобы B "само знало", что A "уже равно 5, а не 10"?
← →
TUser © (2013-05-04 13:45) [25]И как правильно уничтожить X, чтобы Y знал об этом.
Я бы завет некий класс TFoo, от которого бы уже наследовал этот TX. И в конструктуре TFoo написал бы регистрацию создаваемого экземпляра в каком-нибудь синглетоне. И соответственно, в синглетоне реализовал бы свои FreeAndNil и Assigned, ну и записывал бы там, какие объекты уже уничтожены.
"Как сдалать так, чтобы B "само знало", что A "уже равно 5, а не 10"?
B := @A или absolute (не знаю. есть он сейчас или того уже).
← →
Юрий Зотов © (2013-05-04 14:31) [26]> Аббат Пиккола (04.05.13 13:21) [24]
var
A: integer;
B: integer absolute A; // A и B имеют общую память.
Только не нужно всего этого. Вернее, бывает нужно, но очень редко и не в таком контексте. Удобно, когда A и B имеют разные типы и содержимое их общей памяти требуется в разных местах программы трактовать по-разному.
← →
Аббат Пиккола (2013-05-04 16:37) [27]2 Юрий Зотов © (04.05.13 14:31) [26]
Интересно. Спасибо. Не знал про absolute.
Наверно просто никогда не возникало в этом потребности.
← →
Anatoly Podgoretsky © (2013-05-04 16:38) [28]absolute существует с древних времен, еще до Дельфи
← →
NoUser © (2013-05-04 17:56) [29]> Inovet © (04.05.13 05:21) [18]
> А что, в галактике Си принято по несколько указателей создавать?
Не, там целый автопоезд всяко-умных указателей,
( растаскивающих древнейший absolute по своим норам ; )
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2013.10.13;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.002 c