Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Записи(record)


Coder: TCoder; ©   (2004-08-11 11:08:00) 

Предположим что:

type
 TSomeRecord = record
   I: integer;
  end;
var
 T: TSomeRecord;
 P: ^TSomeRecord;

Что происходит при:
 1) T := P^; //область памяти где находится их структура  
             //копируется в нашу? или меняется лишь указатель?
 2) P^ := T; //а здесь?
 3) P^.I := T.I //меняется значение или адрес?
 4) T.I := P^.I //и здесь?

И еще один вопрос: нужно ли освобождать записи объявленные в секции var?


Ega23   (2004-08-11 14:45:00) [1]

Sandman25 ©   (11.08.04 14:41) [10]

Тьфу, я только 3 варианта увидел  :о)


Sandman25   (2004-08-11 14:41:00) [2]

[9] Ega23 ©   (11.08.04 14:29)

Это и есть последний вариант, с передачей P.


Ega23   (2004-08-11 14:29:00) [3]

Sandman25 ©   (11.08.04 14:23) [8]

Нет, ну почему?

Правда результат забавный и непредсказуемый будет:

procedure TForm1.Button2Click(Sender: TObject);

procedure AAA(const P:PInteger);
begin
Dispose(P);
end;

var
P:PInteger;

begin

New(P);
P^:=5;
AAA(P);
ShowMessage(IntToStr(P^));
end;


Sandman25   (2004-08-11 14:23:00) [4]

[7] Erik1   (11.08.04 13:38)

В смысле? Передавать можно
T, const T, var T, P
Dispose можно сделать только для последнего варианта


Erik1   (2004-08-11 13:38:00) [5]

Есть еще один нюанс, если мы передаем в процедуру T то всеравно нередается указатель на структуру. Следовательно если в ней сделать Dispose то будет освобождена базовая структура, повторное освобождение после возврата из процедуры приведет к ошибке.


icWasya   (2004-08-11 13:06:00) [6]

[5] Sandman25
 Рву последние волосы (не скажу где)

итак
2) P^ := T; //в область памяти, на которую ссылается P,
           //копируется структура T
и соответственно ответ на последний вопрос читать в редакции Ega23 [3]


Sandman25   (2004-08-11 11:25:00) [7]

[1] icWasya ©   (11.08.04 11:15)

Во втором пункте ошибка.


Coder: TCoder;   (2004-08-11 11:24:00) [8]

Большое спасибо!!!


Ega23   (2004-08-11 11:18:00) [9]

И еще один вопрос: нужно ли освобождать записи объявленные в секции var?

Нет, надо освобождать память по этим указателям.
Грубо говоря, на каждый New должен быть свой Dispose, на каждый GEtMem - FreeMem, на каждый Create - Free.


TopT   (2004-08-11 11:16:00) [10]

Во всех случаях копируется содержимое, указатели остаются неизменными.
>>И еще один вопрос: нужно ли освобождать записи объявленные в секции var?
Если это поинтеры и ты резервировал под них память с помощью new getmem и тд. то нужно.


icWasya   (2004-08-11 11:15:00) [11]

Что происходит при:
1) T := P^; //область памяти где находится их структура (P^)  
            //копируется в нашу (T)
2) P^ := T; //в P присваивается указатель на T
3) P^.I := T.I //меняется значение
4) T.I := P^.I //меняется значение

кроме того
5) New(P); // в куче создаётся новая структура
           // и указатель на неё присваивается в P

6) Dispose(P); // из кучи по указателю P удаляеncя структура
               // указатель P необнуляется

И еще один вопрос: нужно ли освобождать записи объявленные в секции var?

если сделано 2) то не надо, а если 5), то надо делать 6)


Наверх

Титульная страница Поиск, карта сайта Написать письмо