![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос мастерам Как объяснить следующие утечки памяти ? [D7]
Кто---то © (2004-11-28 01:48:00)
PObj1 = ^TObj1;
TObj1 = record
Name1 : string;
end;
PObj2 = ^TObj2;
TObj2 = array[0..MaxInt shr 4] of TObj1;
TObj3 = record
Name2 : string;
MyArray : PObj2;
end;
...
var
a1 : TObj3;
const
cnt1 = 1;
begin
a1.MyArray := AllocMem(cnt1 * SizeOf(TObj1));
a1.Name2 := 'AAAAAAAAA'; // Эта строка утечек не вызывает.
a1.MyArray[0].Name1 := ''; // С этой строкой утечек нет.
a1.MyArray[0].Name1 := 'A'; // С этой строкой утечка = 12.
a1.MyArray[0].Name1 := 'AA'; // С этой строкой утечка = 12.
a1.MyArray[0].Name1 := 'AAA'; // С этой строкой утечка = 12.
a1.MyArray[0].Name1 := 'AAAA'; // С этой строкой утечка = 16.
a1.MyArray[0].Name1 := 'AAAAА'; // С этой строкой утечка = 16.
FreeMem(a1.MyArray);
Почему 12 ? Почему 16 ? Чем объясняются эти цифры и почему ФриМем не освобождает правильно память ?
Германн (2004-11-28 02:07:00) [21]А ты думал, что строка занимает в памяти столько байт, сколько в ней символов?
Во-первых учти выравнивание. (во-первых, по скольку оно существенно как для Huge(Long)строк, так и для паскалевских.
Во-вторых учти, что Huge(Long)строки, помимо самого их содержания, включают в себя и некую другую информацию и FreeMem тут не годится. Почитай Help о Finalize procedure.
Andy BitOff (2004-11-28 02:05:00) [22]Это всеравно, что удалять гланды через, то место откуда ноги растут.
Sirakuz (2004-11-28 01:59:00) [23]Не понимаю, зачем ты тут динамически выделяешь память, у тебя же массив статический.