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