Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

string в record [D6, Win2k]


VaS ©   (2002-10-23 21:06:00) 

type
PRec = ^TRec;
TRec = record
s: string;
end;
...
var
Rec: PRec;
begin
New(Rec);
try
Rec.s:="A string";
finally
Dispose(Rec);
end;
end;


Есть опасения, что память, выделенная под строку не освободится. Это так?


Bis   (2002-10-24 14:20:00) [1]

история повторяется снова и снова
и кто придумал эту спираль? Не Архимед случайно? ))


VaS   (2002-10-24 14:17:00) [2]

Так-с... :))) Господа разобравшиеся, теперь аргументированно докажите, что память таки освождается.


Skier   (2002-10-24 10:55:00) [3]

>McSimm

> Дело в том, что многие уже разобрались раз и навсегда.

Ага. И я тожу уже. :)


McSimm   (2002-10-24 10:51:00) [4]

>Skier © (24.10.02 10:46)

Дело в том, что многие уже разобрались раз и навсегда.
Но вопрос действительно не теряет актуальности.
(Давно хочу написать статью на тему тонкостей работы со строками, но, видимо, никогда не закончу :( )


Skier   (2002-10-24 10:46:00) [5]

>McSimm © (24.10.02 10:44)
см. Skier © (24.10.02 10:41)
А вообще-то нужно привлечь к этой ветке внимание, чтобы
разобраться с этим раз и навсегда, т.к. вопрос часто задаётся
и спор разгорается каждый раз с новой силой.


McSimm   (2002-10-24 10:46:00) [6]

>Skier © (24.10.02 10:41)
Когда писал еще не видел твоего сообщения.
Так что адресую свое предыдущее сообщение всем как резюме по данному вопросу.


McSimm   (2002-10-24 10:44:00) [7]

>Skier © (24.10.02 10:31)

>>McSimm
>IMHO, ты не прав.


Вполне допуская такую возможность, тем не менее остаюсь при своем мнении.
Поскольку внимательно изучал работу со строками.

Давай обмениваться аргументами. Вот, для начала, выдержка из справки по процедуре Fianlization:
--
If a dynamic variable meets the following two conditions, a call to Finalize is required to finalize the variable before it can be deallocated.

- The variable is deallocated by other means than the Dispose standard procedure (for example using FreeMem).
- The variable contains long strings, variants, or interfaces, not all of which are empty or Unassigned.
--


Anatoly Podgoretsky   (2002-10-24 10:42:00) [8]

Skier © (24.10.02 10:31)
Попробуй это подтвердить


Skier   (2002-10-24 10:41:00) [9]

>McSimm
Да.
Я прогнал FreeMem чрез Alt+Ctrl+C
Finalize не вызывается.
Видимо ты прав.


Bis   (2002-10-24 10:39:00) [10]

народ, лучше проверить, чем спорить или указать где толково объяснено.

Кто знает, как прочитать значение счетчика строк для энси-строк?
Тогда можно сделать тест.


Skier   (2002-10-24 10:31:00) [11]

>McSimm
IMHO, ты не прав.


McSimm   (2002-10-24 10:28:00) [12]

И ответ неправильный.

Правильный ответ - Dispose освободит. FreeMem - нет.


Skier   (2002-10-24 10:00:00) [13]

>VaS
Этот вопрос часто задаётся.
Ответ такой : и FreeMem и Dispose освободятстроку.


SVM (Perm)   (2002-10-24 08:51:00) [14]

Dispose и New вроде как освобождают.
GetMem и FreeMem - нет, надо делать Finalize.


Bis   (2002-10-24 08:23:00) [15]

если у тебя строки короткие, то все ок.
если длинные, то компилятор сам должен заботится об освобождении памяти, выделенной для символов строки.


SottNick   (2002-10-24 06:44:00) [16]

А так пробовал?
TRec = record
s: string[255];
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо