Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
8-41743
Olaf
2003-07-13 21:59
2003.11.13
Люди, помогите с glscene


1-41266
Serg™
2003-10-31 16:23
2003.11.13
Help


4-42272
Olfi
2003-09-11 23:43
2003.11.13
раскладка клавиатуры


1-41634
AlexenderG
2003-11-04 10:08
2003.11.13
Как открыть текстовый файл из командной строки


1-41703
Plt
2003-11-03 13:51
2003.11.13
LoadLibrary не находит библиотеку!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский