Вниз
Скачать: CL | DM;

New vs GetMem   Найти похожие ветки 

← →
DeadMeat   (2009-01-28 12:17) [0]

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

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

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

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

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

GetMem(adr, SizeOf(TMyRecord));

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


← →
Сергей М. ©   (2009-01-28 12:32) [1]

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


← →
DeadMeat   (2009-01-28 12:42) [2]


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

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


← →
Palladin ©   (2009-01-28 12:44) [3]


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

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


← →
Sapersky   (2009-01-28 14:41) [4]

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


← →
DeadMeat   (2009-01-28 15:26) [5]

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


← →
Palladin ©   (2009-01-28 15:32) [6]

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


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

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


← →
jack128_   (2009-01-28 15:40) [7]


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

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


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


← →
Palladin ©   (2009-01-28 15:44) [8]


> jack128_   (28.01.09 15:40) [7]

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


← →
Anatoly Podgoretsky ©   (2009-01-28 16:07) [9]

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

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


← →
jack128_   (2009-01-28 16:22) [10]


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

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


← →
Palladin ©   (2009-01-28 17:10) [11]


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

в том и дело


> jack128_   (28.01.09 16:22) [10]

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



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

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.031 c
15-1232784590
Кое кто
2009-01-24 11:09
2009.03.29
Чем читать файл *.RM?


2-1233905029
stas
2009-02-06 10:23
2009.03.29
TWebBrowser


1-1208418432
Igor_34
2008-04-17 11:47
2009.03.29
WebBrowser и документ Word


2-1234172245
TTLr
2009-02-09 12:37
2009.03.29
Подскажите как склеить 2 таблицы


15-1232422546
DelphiN!
2009-01-20 06:35
2009.03.29
Неудается завершить пользовательский процес




   Наверх