![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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;