![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Выделение блоков памяти [D7]
mr.ASH © (2007-03-13 11:04:00)Привет, уважаемые мастера вот такая возникла проблема:
есть структура
TSomeStruct = record
V: Variant;
P: Pointer;
end;
PSomeStruct = ^TSomeStruct;
я хочу создать сразу несколько экземпляров (допустим 10) такой структуры, выделив под них один блок памяти и пото его разрезав на части:
P := AllocMem(10 * SizeOf(TSomeStruct));
for i:= 0 to 10 do begin
NewStruct := @(integer(P) + i* SizeOf(TSomeStruct));
...
end;
или это же можно сделать используя Array [0..0] of TSomeStruct;
вроде все даже работает.. но когда освобождается память
для всех экземпляров TSomeStruct вроде Dispose(NewStruct); возникает ошибка, связанная с некорректным освобождением памяти... в чем ошибка, что не так?
mr.ASH (2007-03-13 12:58:00) [21]Есть ли способ обойти это и сделать выделение памяти сразу для группы записей??
mr.ASH (2007-03-13 12:38:00) [22]Т.е. если я выделяю блок памяти я не могу его потом освободить по частям, а только весь сразу, и вызывая FreeMem для указателя на начало блока, а не к примеру в середину?
GrayFace (2007-03-13 12:31:00) [23]
> Ок.. юзаем не Dispose, а FreeMem, предварительно финализировав
> вариант.. ошибка все равно остается..
Ты выделяешь один блок, а пытаешься освободить 10 маленьких. Например, сохраняй в начале блока кол-во записей, при освобождении уменьшай на 1 и, если он стал = 0, освобождай память.
mr.ASH (2007-03-13 12:04:00) [24]Я хотел сделать что бы память выделялась не под каждый элемент, а для группы сразу. TList не подходит т.к. я делаю что-то вроде THash и это мне нужно что бы сделать пул элементов. Какие есть альтернативы кроме массивов?
Сергей М. (2007-03-13 11:49:00) [25]
> юзаем не Dispose, а FreeMem .. ошибка все равно остается
А куда она денется ?
Здесь та же самая ситуация, что и с парой New()/Dispose(), с той лишь разницей, что о неявной финализации речи не идет.
Тебе чем TList не угодил ?
mr.ASH (2007-03-13 11:41:00) [26]NewStruct := @(integer(P) + i* SizeOf(TSomeStruct));
да это и есть "разрезка", я разделяю блок памяти на экземпляры структуры
Ок.. юзаем не Dispose, а FreeMem, предварительно финализировав вариант.. ошибка все равно остается..
Сергей М. (2007-03-13 11:12:00) [27]
> и пото его разрезав на части
А где ты его собственно "режешь" ?
Строка
NewStruct := @(integer(P) + i* SizeOf(TSomeStruct));
это вовсе не "резка", это просто получение абсолютного адреса неких данных, находящихся по такому-то смещению в ранее распределенном блоке памяти такого-то размера.
Dispose() предназначен прежде всего для освобождения (и, если необходимо, предварительной финализации) блоков, распределенных с пом. New()