Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
10-1185888918
ВременныйГость
2007-07-31 17:35
2013.10.13
Как получить ячейку экселя через номер столбца


1-1316547907
adigozelov
2011-09-20 23:45
2013.10.13
How to compare two object


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


6-1269732327
BoRoda
2010-03-28 03:25
2013.10.13
Отменить сохранение файла в TWebBrowser


2-1358713890
Очень Злой
2013-01-21 00:31
2013.10.13
Вопросик по указателям





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