Форум: "Основная";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];
ВнизString-поле в Record и Dispose. Найти похожие ветки
← →
KSergey (2003-11-02 10:48) [0]Озадачился таким вот впросом.
Имеем
type
TMyRec = record
S: String;
end;
PMyRec = ^TMyRec;
Делаем:
var
p: PMyRec;
begin
New(p);
p.S := ...
Dispose(p);
end;
Вот что меня озаботило: если бы в структуре строка была фиксированного размера - тогда бы она прямо там и располагалась, памаять освобождается - и все здорово. Однако, если String - то при Dispose произойдет ли корректное оповещение об освобождении памяти, занимаемой собственно строкой? Т.е. можно ли так вообще делать или надо предпринимать дополнительные меры перед Dispose? Или ничего ут не придумать и делать так вообще нельзя, т.к. память потечет рекой?
← →
Думкин (2003-11-02 10:53) [1]Делай.
← →
KSergey (2003-11-02 11:03) [2]Спасибо, Думкин! Буду! А то так бы и мучался, и ничего бы уже сегодня доделать не успел. А так шанс появляется ;)
А чуть подробнее нельзя, как это оно так срабатывает? Для переменных - там, помнится, ссылки подсчитываются на память. А тут? В Dispose какие-то хитрые доп. механизмы вшиты? Или я вообще неверно все представляю?
← →
Song (2003-11-02 11:05) [3]2KSergey © (02.11.03 11:03) [2]
У AnsiString есть длина строки, находящаяся в первых двух байтах.
← →
KSergey (2003-11-02 11:14) [4]> [3] Song © (02.11.03 11:05)
> 2KSergey © (02.11.03 11:03) [2]
> У AnsiString есть длина строки, находящаяся в первых двух
> байтах.
Да это-то понятно. Однако, как я понимаю. в структуре данной хранится просто некий указатель на собственно память, где расположено содержимое строки, ну и ее длина. Ведь сама record не плавает по размеру при изменении содержимого строки ;)
А Dispose, как мне видится - просто освобождает пул памяти, занимаемый структорой, при этом, как понимаю, самой Dispose глубоко наплевать на тип. Ее интересует размер освобождаемого блока. Вернее даже и он ее не интересует, т.к. хранится в менеджере памяти...
А каким же макаром происходит освобождение собственно памяти с содержимым строки?
← →
Думкин (2003-11-02 11:22) [5]Честно сказать - глубоко пока не рыл. Про строки хорошо у Калверта по Д2 написано.
А так - сейчас посмотрю детально.
Но сейчас сделал прогу с большим массивом твоих указатедей.
Запустил в MemProof - вроде все пучком.
Надо будет сейчас код копнуть.
← →
yo (2003-11-02 11:25) [6]Для освобождения полей структуры, являющихся ссылками с
управляемым временем жизни (строки, интерфейсы, дин.массивы),
предусмотрена специальная процедура Finalize.
Если ты посмотришь реализацию Dispose в System.pas,
то увидишь, что она как раз сначала вызывает
Finalize, а затем FreeMem.
Т.е. Думкин прав, и ни о чём в данном случае
беспокоиться не надо.
Но если ты выделяешь память под структуру каким либо другим
способом, напр. GetMem, HeapAlloc, VirtualAlloc и тп, то
ты должен перед освобождением памяти сам вызвать
Finalize( PMyRec(p)^ );
(Finalize берет информацию из статического типа переменной)
← →
KSergey (2003-11-02 11:51) [7]Спасибо всем, что не бросили в беде! ;)
PS
> [6] yo (02.11.03 11:25)
А реализацию Dispose - каюсь, не посмотрел...
Впрочем, сейчас посмотрел - все равно про Finalize не допербы.. Спасибо.
← →
Palladin (2003-11-02 14:10) [8]По мимо этого у строк и дин массивов также присутствует счетчик использования. Аналог refcount в COM... так что нибоись... в любом случае работа с распределением памяти для строк прозрачна до нельзя... :)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.027 c