Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.07.09;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.039 c
10-1121861218
granni
2005-07-20 16:06
2006.07.09
PropertyPage


2-1150542423
antoxa2005
2006-06-17 15:07
2006.07.09
Подскажите, а как корректно подключаться к FireBird?


2-1150789701
Exile
2006-06-20 11:48
2006.07.09
может кто подскажет как решить проблему


1-1148686286
wsih
2006-05-27 03:31
2006.07.09
Сортировака TreeView


1-1148911803
.ruslan
2006-05-29 18:10
2006.07.09
...поверх всех приложений