Delphi 記憶體分配 StrAlloc New

2022-08-08 23:45:27 字數 1235 閱讀 9631

引自:

給字元指標(pchar、pwidechar、pansichar)分配記憶體, 最佳選擇是: stralloc.

stralloc 雖然最終也是呼叫了 getmem, 但 stralloc 會在指標前面新增 delphi 需要的 4 個管理位元組(記錄長度).

stralloc 分配的記憶體, 用 strdispose 釋放, 用 strbufsize 獲取大小.

用 freemem 釋放可以嗎? 這樣會少釋放 4 個位元組.

var

p: pchar;

begin

p := stralloc(256);

getwindowtext(handle, p, strbufsize(p));

showmessage(p);

strdispose(p);

end;

還有一對非常重要的相關函式: globalallocptr、globalfreeptr; 它們的功能是上面這些都不可替代的!

globalallocptr 和 globalfreeptr 是對系統函式: globalalloc、globalfree 的簡化, 之所以說它們重要, 只是因為它們可以跨程序操作; 不過 globalallocptr 是給無型別指標(pointer)分配記憶體, 當然就不僅僅用於字元指標了.

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

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

盡量使用 getmemory 來代替 getmem.

關於 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 吧.

DELPHI之關於String的記憶體分配

函式 過程或者方法中定義乙個字串變數時,由於我們知道在函式 過程或者方法中定義的變數為區域性變數,它的記憶體是在棧中分配的,但是這裡有個小細節我們要注意,對於乙個區域性的字串變數,它的大小為4位元組,這個在棧中分配的4字節是不是就是字串變數的全部呢?答案是否定的,它在棧中儲存的只是這個字元變數的大小...

DELPHI之關於String的記憶體分配 引

在函式 過程或者方法中定義乙個字串變數時,由於我們知道在函式 過程或者方法中定義的變數為區域性變數,它的記憶體 是在棧中分配的,但是這裡有個小細節我們要注意,對於乙個區域性的字串變數,它的大小為4位元組,這個在棧中分配的4字 節是不是就是字串變數的全部呢?答案是否定的,它在棧中儲存的只是這個字元變數...

delphi 精要 讀書筆記 記憶體分配釋放

1.記憶體分為三個區域 全域性變數區,棧區,堆區 全域性變數區 專門存放全域性變數 棧區 分配在棧上的變數可被棧管理器自動釋放 堆區 堆上的變數記憶體必須人工去釋放 2.指標類變數 指標類的變數在宣告為全域性變數時被初始化為空值,在宣告為區域性變數時則初始化為乙個隨機數,對於指標型別一般 要使用一些...