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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.059 c
1-41612
Ganjo
2003-11-04 10:44
2003.11.13
Раскладка клавиатуры


1-41541
Blunder
2003-10-28 08:09
2003.11.13
О строках


1-41713
}|{yk
2003-11-03 11:18
2003.11.13
Как точно называется язык? Object Pascal или Delphi ?


6-41851
Zombie
2003-09-11 08:53
2003.11.13
TWebBrowser


14-42064
zzet
2003-10-21 14:20
2003.11.13
Задача про 12 монет. Возвращение.