Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

New vs GetMem [WinXP]


DeadMeat ©   (2009-01-28 12:17:00) 

Здравсте. Вопрос чисто теоретический. Допустим есть рекорд:

PMyRecord = ^TMyRecord;
TMyRecord = record
 Data: integer;
end;

Надо выделить "под него" память. Т.е. нечто вроде:

var
 bufRecord: PMyRecord;
begin
 New(bufRecord);
 adr := bufRecord;
end;

Но можно выделить и так:

GetMem(adr, SizeOf(TMyRecord));

Вопрос:
а в чем собсна разница? В справке сказано только про параметры. Ну в смысле что по разному передаются. Что New сам вычисляет размер, а в GetMem его надо передать.


Palladin   (2009-01-28 17:10:00) [1]


> Anatoly Podgoretsky ©   (28.01.09 16:07) [9]

в том и дело


> jack128_   (28.01.09 16:22) [10]

не буквоедничай


jack128_   (2009-01-28 16:22:00) [2]


>
> я имел ввиду к нетипизированным указателям...

В случае НЕтипизировнаного указателя New просто обниливает его. Хотя конечно это не очевидно..


Anatoly Podgoretsky   (2009-01-28 16:07:00) [3]

> Palladin  (28.01.2009 15:44:08)  [8]

В случае нетипизированного указателя непоятно сколько выделять.


Palladin   (2009-01-28 15:44:00) [4]


> jack128_   (28.01.09 15:40) [7]

я имел ввиду к нетипизированным указателям... согласен, косяк с моей стороны...


jack128_   (2009-01-28 15:40:00) [5]


> А ты New к выделению памяти нерекордам и не применишь.

var
 S: ^string;
begin
  New(S);
end;  


PS New/Dispose применимы к любому указателю.


Palladin   (2009-01-28 15:32:00) [6]

А ты New к выделению памяти нерекордам и не применишь.


> по сути New лучше для рекордов

Она не лучше, она для них и предназначена.


DeadMeat   (2009-01-28 15:26:00) [7]

Все понятно. Т.е. по сути New лучше для рекордов, а GetMem для памяти, которая используется блоком (картинку загрузить, файл и т.п.).
Всем спасибо за ответы. Тема исчерпана.


Sapersky   (2009-01-28 14:41:00) [8]

На данный момент вся инициализация - это заполнение полей нулями, так что практической разницы между New и AllocMem нет (разве что первая "прицельно" заполняет managed-поля, а не все подряд).
Вот между Dispose и FreeMem - есть и существенная, финализация сложнее чем просто обнуление.


Palladin   (2009-01-28 12:44:00) [9]


>  А в чем заключается инициализация данных собсна?

в инициализации/финализации полей типа String, Array of, Variant и пр. с управляемым rtl временем жизни


DeadMeat   (2009-01-28 12:42:00) [10]


> Сергей М. ©   (28.01.09 12:32) [1]

Спасибо. А в чем заключается инициализация данных собсна? Вот, к примеру, AllocMem инициализирует нулями блок памяти. А New что в этом случае делает?


Сергей М.   (2009-01-28 12:32:00) [11]

New/Dispose отвечает за инициализацию/финализацию данных в аллокируемых/деаллокируемых блоках , в то время как Get/FreeMem занимается только аллокацией/деаллокацией блоков.


Наверх

Титульная страница Поиск, карта сайта Написать письмо