Форум: "Основная";
Текущий архив: 2004.08.29;
Скачать: [xml.tar.bz2];
ВнизЗаписи(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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.035 c