給資料指標分配記憶體

2022-06-09 07:00:23 字數 3232 閱讀 5479

對靜態陣列指標, 雖然在宣告之處並沒有分配記憶體, 但這個指標應該分配多少記憶體是有定數的.

這種情況, 我們應該用 new 和 dispose 來分配與釋放記憶體. 譬如:

type

tarr1 =array[0..255

]ofchar;

tarr2 =array[0..255

]ofinteger;

var

arr1: ^tarr1;

arr2: ^tarr2;

begin

new(arr1);

new(arr2);

arr1^ := '萬一的 delphi 部落格'

; showmessagefmt('%s%s'

, [arr1^[0

], arr1^[1

]]);

// showmessagefmt('%s%s', [arr1[0], arr1[1]]);

arr2[low(arr2^)] := low(integer);

arr2[high(arr2^)] := maxint;

showmessagefmt('%d, %d'

, [arr2[0

], arr2[255

]]);

dispose(arr1);

dispose(arr2);

end;

給已知大小的指標分配記憶體應該用 new, 上面的例子是關於靜態陣列指標的, 後面要提到的結構體(記錄)的指標也是如此.

new 的本質也函式呼叫 getmem, 但不需要我們指定大小了.

那怎麼給動態陣列的指標分配記憶體呢? 其實動態陣列變數本身就是個指標, 就不要繞來繞去再給它弄指標了.

不過有乙個理念還是滿重要的, 那就是我們可以把乙個無型別指標轉換為動態陣列型別, 譬如:type

tarr =array

ofinteger;

var

p: pointer;

begin

getmemory(p, 3

* sizeof(integer));

tarr(p)[0

] := random(100

); tarr(p)[1

] := random(100

); tarr(p)[2

] := random(100

); showmessagefmt('%d,%d,%d'

, [tarr(p)[0

], tarr(p)[1

], tarr(p)[2

]]);

freememory(p);

end;

這裡用到了 getmemory 和 freememory, 對分配無型別指標這是比較常用的

先總結下: 

new 是給已知大小的指標分配記憶體;

getmem 主要是給無型別指標分配記憶體;

盡量使用 getmemory 來代替 getmem.

還有個 allocmem 和它們又有什麼區別呢?

allocmem 分配記憶體後會同時初始化(為空), getmem 則不會, 先驗證下:var

p1,p2: pointer;

begin

p1 := allocmem(256

); showmessage(pchar(p1));

freememory(p1);

p2 := getmemory(256

); showmessage(pchar(p2));

freememory(p2);

end;

關於 freememory 與 freemem 的區別:

1、freememory 會檢查是否為 nil 再 freemem, 這有點類似: free 與 destroy;

2、freemem 還有個預設引數可以指定要釋放的記憶體大小, 不指定就全部釋放(沒必要只釋放一部分吧);

3、new 對應的 dispose 也可以用 freemem 或 freememory 代替.

盡量使用 freememory 來釋放 getmem、getmemory、allocmem、reallocmem、reallocmemory 分配的記憶體.

reallocmem、reallocmemory 是在已分配的記憶體的基礎上重新分配記憶體, 它倆差不多 reallocmemory 比 reallocmem 多乙個 nil 判斷, 盡量使用 reallocmemory 吧. 譬如:type

tarr =array[0..

maxlistsize]ofchar;

parr = ^tarr;

var

arr: parr;

i: integer;

begin

arr := getmemory(5

);fori := 0

to

4doarr[i] := chr(65

+i);

showmessage(pchar(arr));

arr := reallocmemory(arr, 26

); showmessage(pchar(arr));

fori := 0

to

25doarr[i] := chr(65

+i);

showmessage(pchar(arr));

end;

給結構體指標分配記憶體

使用結構或結構陣列,一般是不需要主動分配記憶體的,譬如 var pts tpoint begin pts.x 1 pts.y 2 showmessagefmt d,d pts.x,pts.y end 結構陣列 var arr array 0 2 oftpoint i integer begin fo...

指標記憶體分配

1 一維指標記憶體分配。作陣列使用時 int p null 儲存int型別資料 int n 7 陣列長度 p int malloc sizeof int n int i for i 0 i0 free p 釋放2 指標陣列記憶體分配 int n 6 int p n 儲存int指標型別資料的陣列 p ...

指標以及記憶體分配

指標很靈活,這使得指標很難管理,在定義指標時,將在棧中開闢一塊記憶體存放指標的位址 棧內的記憶體由系統分配和釋放 指標的位址記憶體只是存放指標的位址,不存放指標指向的資料,值得注意的是,定義指標時指標會隨機指向一塊記憶體,如int p p會指向一塊不為空的記憶體,相當危險,例如執行判斷if p 這裡...