Форум: "Основная";
Текущий архив: 2006.07.09;
Скачать: [xml.tar.bz2];
Внизnew и Getmem как покрасивее совместить? Найти похожие ветки
← →
boalse © (2006-05-29 15:19) [0]Необходимо
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.
Что посоветуете?
← →
TUser © (2006-05-29 15:20) [1]New выполнит оба пункта
← →
Ega23 © (2006-05-29 15:23) [2]New посмотрит в RTTI, определит, на что у нас указатель, определит размер этого "чего" и выделит именно столько байт.
GetMem в RTTI не полезет.
← →
TUser © (2006-05-29 15:28) [3]Можно также пользоваться AllocMem, Malloc, Realloc
← →
boalse © (2006-05-29 15:38) [4]
> New выполнит оба пункта
Не пойму.
Есть у меня указатель
P: Pointer;
Я не знаю заранее, что я буду записывать - строку, Integer, Cardinal.
В программу динамически поступает информация , например: "необходимо разместить в памяти строку длинной 32 символа". Значит, я должен где-то выделить 32 байта.
Первый этап, я должен определить, где. New мне здесь поможет, но как она поймёт, что нужно выделять 32 байта?
← →
DrPass © (2006-05-29 15:40) [5]
> getmem выбеляет любое количество байт, но для строго определённого
> указателся
Что значит "строго определенный указатель"? Она выделяет память для любого указателя, точно так же как и new. Только размер необходимого блока определяет не самостоятельно по RTTI, а использует заданный явным образом
← →
boalse © (2006-05-29 15:41) [6]А вот AllocMem, похоже, то, что нужно. Спасибо.
Но, всёже хочется понять, как так:
> New выполнит оба пункта
← →
TUser © (2006-05-29 15:50) [7]> Но, всёже хочется понять, как так:
> > New выполнит оба пункта
Будет указтель на неиспользуемую до сих пор память и выделено под нее место. Честно говоря, я слабо себе представляю задачу, когда этого недостаточно. Ведь данные-то приходят не абы какие (а если абы - то чего с ними делать?-), следоватлеьно можно придумать определенный тип для этих данный и использовать New.
← →
boalse © (2006-05-29 15:54) [8]Разобрался, спасибо всем.
← →
han_malign © (2006-05-29 15:57) [9]
> Первый этап, я должен определить, где. New мне здесь поможет, но как она поймёт, что нужно выделять 32 байта?
- а никак - чтобы определить где, надо знать сколько, дабы найти первый неразрывный блок памяти(диапазон виртуальных адресов) требуемого размера...
Или ты хочешь создать косвенную ссылку? Если нет - учи матчасть...
З.Ы.
New(Pointer(p));
- гы, прикольный метод обнуления переменной, я думал такое не пройдет...
← →
TUser © (2006-05-29 16:13) [10]
> New(Pointer(p));
> - гы, прикольный метод обнуления переменной, я думал такое
> не пройдет...
Очень прикольный, приводит к утечке памяти.
← →
han_malign © (2006-05-29 16:35) [11]
> Очень прикольный, приводит к утечке памяти.
New(Pointer(p));xor eax,eax
call @GetMem
test eax, eax
jle ...
.....
xor ebx, ebx
mov eax, ebx
ret
- никаких утечек...
← →
Ega23 © (2006-05-29 16:58) [12]
> - никаких утечек...
var
List:TStringList;
begin
List:=TStringList.Create;
New(Pointer(List))
end;
← →
han_malign © (2006-05-29 18:08) [13]
> Ega23 ©
List:=TStringList.Create;
List:= nil;
- к утечкам не приводит?
инициализация и "затирание" разные вещи...
← →
Ega23 © (2006-05-29 18:12) [14]А зачем инициализацию ТАК делать? Не проще ли p:=nil?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.07.09;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.008 c