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

Вниз

Записи(record)   Найти похожие ветки 

 
Coder: TCoder;   (2004-08-11 11:08) [0]

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

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?


 
icWasya ©   (2004-08-11 11:15) [1]

Что происходит при:
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)


 
TopT   (2004-08-11 11:16) [2]

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


 
Ega23 ©   (2004-08-11 11:18) [3]

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

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


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

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


 
Sandman25 ©   (2004-08-11 11:25) [5]

[1] icWasya ©   (11.08.04 11:15)

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


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

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

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


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

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


 
Sandman25 ©   (2004-08-11 14:23) [8]

[7] Erik1   (11.08.04 13:38)

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


 
Ega23 ©   (2004-08-11 14:29) [9]

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:41) [10]

[9] Ega23 ©   (11.08.04 14:29)

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


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

Sandman25 ©   (11.08.04 14:41) [10]

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



Страницы: 1 вся ветка

Текущий архив: 2004.08.29;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.037 c
1-1092717893
Sash
2004-08-17 08:44
2004.08.29
загрузка HTML в МЕМО


14-1092229871
Дмитрий12
2004-08-11 17:11
2004.08.29
как запустить компонент панели управления


9-1084373855
S.W.I.N.E.
2004-05-12 18:57
2004.08.29
Крысы и DelphiX


1-1092297320
AlexFe
2004-08-12 11:55
2004.08.29
Изменение размера ComboBox


4-1090015555
Virtual GOD
2004-07-17 02:05
2004.08.29
Работа с консольным приложеним