Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.02.27;
Скачать: [xml.tar.bz2];

Вниз

Динамическое выделение памяти   Найти похожие ветки 

 
Tornado   (2003-02-18 07:49) [0]

Вычитал в одной книге о динамическом выделении памяти для переменных таким образом:

var W: ^Integer;
....
New(P); {выделяем память под перем. W}
W^ := 100;
....
Dispose(W) {освобождаем память, выделенной для перем. W}


Вопрос: нужно ли в программе таким вот образом выделять память для переменных и что это дает? Может существуют другие способы? Спасибо.


 
Думкин   (2003-02-18 07:55) [1]


> var W: ^Integer;
> ....
> New(P); {выделяем память под перем. W}
> W^ := 100;
> ....
> Dispose(W) {освобождаем память, выделенной для перем.
> W}

если в процедуре - то ноги вон, да и вообще - дико.
Указатели - это ВЫ в программировании и нечто подобное вышеуказаному ... а самому как?


 
first_aid   (2003-02-18 08:13) [2]

> var W: ^Integer;
> ....
> New(P); {выделяем память под перем. W}
> W^ := 100;
> ....
> Dispose(W) {освобождаем память, выделенной для перем. W}

Именно так нет никакого смысла, память то ты выделяешь для P, а значение присваиваешь W^, которую потом еще и убить хочешь, хотя нигде ранее для нее память не выделял.


 
Tornado   (2003-02-18 08:38) [3]

Думкин © (18.02.03 07:55)

Это из книги пример, и хотел получить Ваше мнение по этому поводу. А как не дико?

first_aid © (18.02.03 08:13)

Тут очепяточка вышла, вместо New(P) конечно же New(W)


 
MBo   (2003-02-18 08:43) [4]

>Tornado
Этот способ - классический паскальный. Применяется для выделения памяти, когда неизвестно, сколько ее понадобится, например, для динамических структур (списки), или для больших структур данных, под которые не стоит резервировать место на все время работы программы. В процедурах применяется редко, поскольку и так память под локальные переменные выделяется динамически из стека при входе в процедуру, потом освобождается.


 
Tornado   (2003-02-18 09:31) [5]

MBo © (18.02.03 08:43)

Спасибо за исчерпывающий ответ!


 
han_malign   (2003-02-18 10:32) [6]

>когда неизвестно, сколько ее понадобится
- как раз в случае New и Dispose - известно, по идее New <==> GetMem(W,sizeof(W^))...
system.pas:
procedure _New{ size: Longint; typeInfo: Pointer};
asm
{ -> EAX size of object to allocate }
{ EDX pointer to typeInfo }

PUSH EDX
CALL _GetMem
POP EDX
TEST EAX,EAX
JE @@exit
PUSH EAX
CALL _Initialize
POP EAX
@@exit:
end;

procedure _Dispose{ p: Pointer; typeInfo: Pointer};
asm
{ -> EAX Pointer to object to be disposed }
{ EDX Pointer to type info }

PUSH EAX
CALL _Finalize
POP EAX
CALL _FreeMem
end;

- во - еще инициализация добавлена и очистка (динамические массивы и строки автоматом освобождаются)


 
PVOzerski   (2003-02-18 12:58) [7]

>>когда неизвестно, сколько ее понадобится
>- как раз в случае New и Dispose - известно, по идее New <==>
>GetMem(W,sizeof(W^))...

На самом деле, несмотря на то, что han_malign здесь формально прав, чисто на new/dispose можно сооружать связанные списки и тому подобные конструкции заранее не известной длины. Другое дело, что от этих конструкций можно уйти, пользуясь динамическими массивами, GetMem/FreeMem/ReallocMem, WinAPI-функцими вроде GlobalRealloc и т.д. Вот только задумывался ли кто-нибудь, что делается "внутри" ReallocMem? А там в некоторых ситуациях делается такое (по крайней мере в D3): целиком выделяется новый блок, в него копируется содержимое старого, а старый ликвидируется. Если эти блоки большие - :^((( .


 
han_malign   (2003-02-18 13:08) [8]

Мало того, старый Borland-овский расширитель защищенного режима ДОС (rtm.exe) - позволял делать только около 2200 - GlobalAlloc и не больше 6-и GlobalRealloc, после чего валился... Правда это уже мало актуально :)))



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.02.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.007 c
4-87759
Pirat
2003-01-12 02:35
2003.02.27
как выполнить SetParent?


1-87404
Stager
2003-02-18 10:32
2003.02.27
Посоветуйте правильный подход


3-87255
skorpi
2003-02-11 12:46
2003.02.27
Конветация данных из Interbase в MySQL


1-87361
Alek_1
2003-02-16 21:01
2003.02.27
Image1


1-87427
McAndy
2003-02-18 15:03
2003.02.27
Можно ли записать в файл экземпляр объекта





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский