對靜態陣列指標, 雖然在宣告之處並沒有分配記憶體, 但這個指標應該分配多少記憶體是有定數的.
這種情況, 我們應該用 new 和 dispose 來分配與釋放記憶體. 譬如:
typetarr1 =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 這裡...