![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Записи(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)