• <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);
            系統會有一個指針指向這個對象
            當你解構一個物件 SomeComponet.Free;
            系統會將指針指到的東西殺掉,但是指標還是指在相同的位置
            請注意計算機的資源是有限的,
            所以可能下一步你的程序要跟系統要資源,
            剛才的指針位置,就出現了其它的數據
            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 已經

            執行過 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;

            久久精品嫩草影院| 久久精品成人欧美大片| 久久中文骚妇内射| 久久国产精品99久久久久久老狼 | 久久这里只精品国产99热| 99久久伊人精品综合观看| 一级女性全黄久久生活片免费| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区| 久久精品国产亚洲av高清漫画| 99热精品久久只有精品| 精品国产青草久久久久福利| 久久亚洲AV成人无码国产| 久久久WWW成人免费毛片| 亚洲AV无码1区2区久久| 国产精品久久久久乳精品爆| 久久久久久精品成人免费图片| 青青青青久久精品国产| 97久久婷婷五月综合色d啪蜜芽| 国产三级精品久久| 看久久久久久a级毛片| 久久精品无码免费不卡| 久久精品九九亚洲精品| 亚洲国产成人精品女人久久久 | 91精品国产综合久久精品| 天堂无码久久综合东京热| 国产精品青草久久久久婷婷| 久久精品中文字幕大胸| 91麻豆国产精品91久久久| 久久99国产一区二区三区| 婷婷久久综合九色综合98| 久久久久久久免费视频| 色综合久久中文综合网| 99久久人妻无码精品系列| 色综合久久综合中文综合网| 久久精品免费一区二区| 伊人久久亚洲综合影院| 久久人人青草97香蕉| 亚洲精品国产综合久久一线| 久久午夜无码鲁丝片午夜精品| 久久不见久久见免费影院www日本| 成人午夜精品久久久久久久小说 |