Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.01 c
2-1151083509
resuS
2006-06-23 21:25
2006.07.09
SOCKS прокси сервер 4/5


2-1150937975
Dyakon_Frost
2006-06-22 04:59
2006.07.09
Проблемы с написанием проги!


11-1129900923
Muxaspb
2005-10-21 17:22
2006.07.09
Проблема с TBitmap.StretchDraw


2-1150979987
*delete*
2006-06-22 16:39
2006.07.09
как проверить создание папки


2-1150972496
Neket
2006-06-22 14:34
2006.07.09
И снова DBGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский