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

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

new и Getmem как покрасивее совместить? [D7, WinXP]


boalse ©   (2006-05-29 15:19:00) 

Необходимо
1. получить указатель на неиспользуемую область памяти
2. выделить в этой области N-ое количество байт (N определяется в ран-тайме).

New(P) возвращает в P адрес новой переменной, т.е. то, что требуется в п. 1., однако, этот метод выделяет строго определённое количество байт.
getmem выбеляет любое количество байт, но для строго определённого указателся.
Можно, конечно, замутить что-то вроде:

New(P);
GetMem(P,N);

Но что-то мне подсказывает, что это не оптимальный вариант.
Посмотрел как компиллируется New, написал аналогичную функцию, но только здесть в eax передаётся не константа, а переменная ASize:

Function NewVar(ASize: Cardinal): Pointer;
asm
 call @GetMem
end;

Компилятор не знает, что такое @GetMem, выдаёт ошибку. Однако, отладчик делфи показывает именно @GetMem.
Что посоветуете?


Ega23   (2006-05-29 18:12:00) [1]

А зачем инициализацию ТАК делать? Не проще ли p:=nil?


han_malign   (2006-05-29 18:08:00) [2]


> Ega23 ©

List:=TStringList.Create;
List:= nil;
- к утечкам не приводит?
инициализация и "затирание" разные вещи...


Ega23   (2006-05-29 16:58:00) [3]


> - никаких утечек...


var
List:TStringList;
begin

List:=TStringList.Create;
New(Pointer(List))
end;


han_malign   (2006-05-29 16:35:00) [4]


> Очень прикольный, приводит к утечке памяти.

New( Pointer(p));
xor eax,eax
call @GetMem
       test eax, eax
       jle ...
       .....
       xor ebx, ebx
       mov eax, ebx
       ret

- никаких утечек...


TUser   (2006-05-29 16:13:00) [5]


> New(Pointer(p));
> - гы, прикольный метод обнуления переменной, я думал такое
> не пройдет...

Очень прикольный, приводит к утечке памяти.


han_malign   (2006-05-29 15:57:00) [6]


> Первый этап, я должен определить, где. New мне здесь поможет, но как она поймёт, что нужно выделять 32 байта?

- а никак - чтобы определить где, надо знать сколько, дабы найти первый неразрывный блок памяти(диапазон виртуальных адресов) требуемого размера...
Или ты хочешь создать косвеннуюссылку? Если нет - учи матчасть...

З.Ы.
New(Pointer(p));
- гы, прикольный метод обнуления переменной, я думал такое не пройдет...


boalse   (2006-05-29 15:54:00) [7]

Разобрался, спасибо всем.


TUser   (2006-05-29 15:50:00) [8]

> Но, всёже хочется понять, как так:
> > New выполнит оба пункта

Будет указтель на неиспользуемую до сих пор память и выделено под нее место. Честно говоря, я слабо себе представляю задачу, когда этого недостаточно. Ведь данные-то приходят не абы какие (а если абы - то чего с ними делать?-), следоватлеьно можно придумать определенный тип для этих данный и использовать New.


boalse   (2006-05-29 15:41:00) [9]

А вот AllocMem, похоже, то, что нужно. Спасибо.

Но, всёже хочется понять, как так:
> New выполнит оба пункта


DrPass   (2006-05-29 15:40:00) [10]


> getmem выбеляет любое количество байт, но для строго определённого
> указателся

Что значит "строго определенный указатель"? Она выделяет память для любого указателя, точно так же как и new. Только размер необходимого блока определяет не самостоятельно по RTTI, а использует заданный явным образом


boalse   (2006-05-29 15:38:00) [11]


> New выполнит оба пункта


Не пойму.
Есть у меня указатель

P: Pointer;

Я не знаю заранее, что я буду записывать  - строку, Integer, Cardinal.
В программу динамически поступает информация , например: "необходимо разместить в памяти строку длинной 32 символа". Значит, я должен где-то выделить 32 байта.
Первый этап, я должен определить, где. New мне здесь поможет, но как она поймёт, что нужно выделять 32 байта?


TUser   (2006-05-29 15:28:00) [12]

Можно также пользоваться AllocMem, Malloc, Realloc


Ega23   (2006-05-29 15:23:00) [13]

New посмотрит в RTTI, определит, на что у нас указатель, определит размер этого "чего" и выделит именно столько байт.
GetMem в RTTI не полезет.


TUser   (2006-05-29 15:20:00) [14]

New выполнит оба пункта


Наверх

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