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

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

Выделение блоков памяти [D7]


Страницы:   1 2

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()


Страницы:   1 2

Наверх

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