Главная страница
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.034 c
1-1092504966
начинающий
2004-08-14 21:36
2004.08.29
Матрица


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


1-1092300157
WondeRu
2004-08-12 12:42
2004.08.29
Классы!


11-1079939900
nester
2004-03-22 10:18
2004.08.29
Глюк с TabControl. Col1 объявляется дважды.


1-1092581140
Белый волк
2004-08-15 18:45
2004.08.29
Допустимые символы