• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運轉,開心的工作
            簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            關于delphi Assigned

            Posted on 2010-08-20 14:08 S.l.e!ep.¢% 閱讀(667) 評論(0)  編輯 收藏 引用 所屬分類: Delphi
            關于delphi Assigned
            2009-02-24 08:09

            1. 根據 Delphi 指令參考手冊中

            說明:
            Assigned
            函式在參數不為 nil 時傳回 True, 表示指針已經指到某個內存地址,這個內存地址可能是一個對象地首地址,也可能在函數或過程中,聲明一個指針變量,沒有賦值為 nil ,無亂的指向某處,這兩個種情況, Assigned (指針變量)都不為 nil , 函數放回 True

            而參數為 nil 時則傳回 False


            Assigned
            并不是一個真正的函數。

            技巧:
            用呼叫 Assigned 的方式來取代直接把參數拿來和 nil 比較,效率會更好。

            2. 這個問題要從內存方面來解釋
            當你建構一個物件 SomeComponet.Create(Owner);
            系統(tǒng)會有一個指針指向這個對象
            當你解構一個物件 SomeComponet.Free;
            系統(tǒng)會將指針指到的東西殺掉,但是指標還是指在相同的位置
            請注意計算機的資源是有限的,
            所以可能下一步你的程序要跟系統(tǒng)要資源,
            剛才的指針位置,就出現了其它的數據
            If Assigned(SomeComponet) then SomeComponet := nil;
            先檢查這個對象有沒有在其它地方被設成 nil
            然后再將它設成 nil

            當我們無法預測使用者會如何操爆他的計算機,
            程序員必須留意內存的管理。 小弟淺見 ...


            3
            function Assigned(var P): Boolean;

            Description

            Use Assigned to determine whether the pointer or procedure referenced by P is nil. P must be a variable reference of a pointer or procedural type. Assigned(P) corresponds to the test P<> nil for a pointer variable, and @P <> nil for a procedural variable.

            Assigned returns False if P is nil, True otherwise.

            檢查指針指向的參考變量或過程是否為 nil

            每次我通常的處理方法都是:

            if assigned(frm) then frm.close;?? 但是當下次調用時就會出錯。為什么呢,直到咋天我才知道原因

            frm.close;frm.free; 只是指定這塊內存可以重寫,并未釋放為 NIL 因此當下次調用時即使 frm.free 已經

            執(zhí)行過 assigned(frm) 仍為 TRUE ,再次釋放 frm.Close 或者 frm.free 肯定會報錯;應為 frm.Close frm.free 是釋放 對象指針 frm 指向的內存空間,在上次已經釋放調了,但是 frm 本身并沒有 初始化為 nil , 相反它還是指向被釋放的內存地址;東西已經沒有了,沒有地東西去釋放,不報錯錯才怪。

            正確的處理方法:

            if assigned(frm) then
            begin
            ?? frm.close;
            ?? frm:=nil;
            end;

            :

            if assigned(frm) then
            begin
            frm.close;
            freeandnil(frm);
            end;

            // 可以測試一些就能真正理解 FreeAndNil Assigned 函數地使用方法了;

            procedure FreeAndNil(var Obj);

            Description

            Use FreeAndNil to ensure that a variable is nil after you free the object it references. Pass any variable that represents an object as the Obj parameter.

            var P: Pointer;

            begin
            P := nil;
            if Assigned (P) then Writeln ('You won''t see this');
            GetMem(P, 1024); {P valid}
            FreeMem(P, 1024); {P no longer valid and still not nil}
            if Assigned (P) then Writeln ('You''ll see this');
            end;

            无码超乳爆乳中文字幕久久 | 国内精品久久久久久麻豆| 久久综合久久综合久久综合| 久久亚洲综合色一区二区三区| 精品国产一区二区三区久久蜜臀| 久久久噜噜噜久久| 人妻无码αv中文字幕久久琪琪布| 久久午夜羞羞影院免费观看| 国内精品久久久久久久久电影网 | 久久午夜福利电影| 亚洲伊人久久大香线蕉综合图片| 成人久久综合网| 久久精品人人做人人爽电影| 99久久这里只有精品| 欧美日韩精品久久久免费观看| 久久精品国产免费| 久久综合九色综合网站| 久久久久国色AV免费看图片| 2021久久国自产拍精品| 久久精品国产亚洲av麻豆蜜芽 | 国产精品国色综合久久| 亚洲精品97久久中文字幕无码 | 色天使久久综合网天天| 国产亚洲精品自在久久| 久久无码AV中文出轨人妻| 久久久久无码中| 久久国产综合精品五月天| 狠狠干狠狠久久| 久久电影网一区| 久久99中文字幕久久| 久久久久国产精品熟女影院| 久久精品国产2020| 无码国内精品久久综合88| 久久伊人五月丁香狠狠色| 伊人久久无码精品中文字幕| 欧美大战日韩91综合一区婷婷久久青草 | 青青热久久国产久精品 | 国产亚洲美女精品久久久| 国内精品久久久久久久涩爱| 精品欧美一区二区三区久久久| 久久99精品久久久久久9蜜桃|