String 中的秘密
| [3] - String 中的秘密 | |
| ? | |
//String 的指針地址及實(shí)際的內(nèi)存地址
var
str: string;
pstr: PString;
pc: PChar;
begin
{在沒有給 str 賦值以前, 既然聲明了, 就有了指針地址(@str):}
ShowMessage(IntToStr(Integer(@str))); {1244652; 這是在棧中的 str 的指針地址}
{但現(xiàn)在還沒有分配真正儲(chǔ)存字符串內(nèi)存}
ShowMessage(IntToStr(Integer(str))); {0; 0 就是 null}
str := 'Delphi';
{一旦賦值后...}
ShowMessage(IntToStr(Integer(@str))); {1244652; 這是在棧中的 str 的指針地址}
ShowMessage(IntToStr(Integer(str))); {4580800; 這是在堆中的 str 的實(shí)際地址}
{通過指針地址獲取字符串, 其中的 pstr 是前面定義的字符串指針}
pstr := @str;
ShowMessage(pstr^); {Delphi}
{通過實(shí)際地址獲取字符串, 其中的 pc 是前面定義的字符指針}
pc := PChar(Integer(str));
ShowMessage(pc);?? {Delphi}
end;
--------------------------------------------------------------------------------
一個(gè)字符串(AnsiString 或 String, 譬如是 "Form1" )在內(nèi)存中是這樣儲(chǔ)存的:
???
黃色區(qū)域是真正存字符串的位置, 前面說的字符串所在的內(nèi)存地址, 就是本例中的 "F" 所在的位置;
藍(lán)色的四個(gè)字節(jié)儲(chǔ)存一個(gè) Integer 值, 表示字符串的長度;
最后紅色的一個(gè)字節(jié)儲(chǔ)存一個(gè)空字符(#0), 表示字符串的結(jié)束, 同時(shí)也是為了和 Windows 的 null 結(jié)束的字符串兼容;
綠色的四個(gè)字節(jié)也是一個(gè) Integer 值, 表示該字符串被引用的次數(shù)(也就是有幾個(gè)字符串的指針指向它).
還是看例子吧:
--------------------------------------------------------------------------------
var
str,s1,s2: string;
pint: PInteger;
begin
str := Self.Text; {把窗體標(biāo)題給它吧; 現(xiàn)在 str 指向了窗體標(biāo)題所在的內(nèi)存位置}
s1 := str;?????? {給 s1 賦值}
s2 := str;?????? {給 s2 賦值; 現(xiàn)在窗體標(biāo)題已經(jīng)有了 str、s1、s2 三個(gè)引用}
{str、s1、s2 的指針肯定不一樣; 但現(xiàn)在指向內(nèi)存的同一個(gè)位置, 測試:}
ShowMessage(IntToStr(Integer(str))); {15190384}
ShowMessage(IntToStr(Integer(s1))); {15190384}
ShowMessage(IntToStr(Integer(s2))); {15190384}
{向左偏移 4 個(gè)字節(jié)就是字符串長度的位置, 讀出它來(肯定是5):}
pint := PInteger(Integer(str) - 4);
ShowMessage(IntToStr(pint^));???? {5}
{向左偏移 8 個(gè)字節(jié)就是字符串的引用計(jì)數(shù), 讀出它來(肯定是3):}
pint := PInteger(Integer(str) - 8);
ShowMessage(IntToStr(pint^));???? {3}
end;
--------------------------------------------------------------------------------
當(dāng)某段字符串內(nèi)存的引用計(jì)數(shù)為 0 時(shí), Delphi 就會(huì)自動(dòng)釋放它; 這也是字符串不需要手動(dòng)釋放的原因.
我在測試時(shí)發(fā)現(xiàn): 所有常量和非全局的變量的引用計(jì)數(shù)一直是 "-1".
--------------------------------------------------------------------------------
總結(jié)
以上是生活随笔為你收集整理的String 中的秘密的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不要惊奇这种观点400电话
- 下一篇: 我的飞鸽传书程序,很好!!!