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

Вниз

Проблема с указателем.   Найти похожие ветки 

 
О-Сознание   (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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.005 c
1-1315492229
denkop
2011-09-08 18:30
2013.10.13
Сохранить скриншот неактивной формы


15-1367699402
Юрий
2013-05-05 00:30
2013.10.13
С днем рождения ! 5 мая 2013 воскресенье


11-1248262717
tcler
2009-07-22 15:38
2013.10.13
tinifile и windows 7


15-1367390399
Dimka Maslov
2013-05-01 10:39
2013.10.13
Реализация интерфейсов


2-1358780606
Аскалот
2013-01-21 19:03
2013.10.13
PaintBox и другие