Главная страница
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.024 c
4-42315
Akvilon
2003-09-06 18:42
2003.11.13
SetWindowLong(hwnd, GWL_WNDPROC ...


1-41326
UnixManiac
2003-10-31 01:08
2003.11.13
Не хочет работать TMediaPlayer


1-41525
Stas
2003-10-28 11:07
2003.11.13
TCanvas


3-41086
Брат
2003-10-23 11:24
2003.11.13
функция Sum в SQL


1-41542
Stratos
2003-10-27 23:28
2003.11.13
Перемещение ряда в TStringGrid e