• <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.¢% 閱讀(664) 評論(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;

            久久无码高潮喷水| 国产亚洲美女精品久久久| 亚洲精品综合久久| 无码人妻久久一区二区三区蜜桃| 伊人热热久久原色播放www| 久久久久久精品无码人妻| 99久久99久久精品国产| 久久九九兔免费精品6| 91精品国产乱码久久久久久| 久久乐国产精品亚洲综合| 精品无码久久久久国产| 天堂无码久久综合东京热| 久久国产乱子伦精品免费强| 熟妇人妻久久中文字幕| 久久大香萑太香蕉av| 久久精品无码专区免费东京热| 国产激情久久久久久熟女老人| 久久久久久极精品久久久| 久久免费精品一区二区| 99久久超碰中文字幕伊人| 久久久免费观成人影院| 久久婷婷国产麻豆91天堂| 久久精品国产99久久久古代| 久久精品亚洲精品国产欧美| 精品国际久久久久999波多野 | 狠狠色丁香婷婷综合久久来来去| 日韩欧美亚洲综合久久| 青春久久| 久久久久国产一区二区三区| WWW婷婷AV久久久影片| 欧美噜噜久久久XXX| 久久久久亚洲AV无码麻豆| 亚洲午夜久久久| 亚洲伊人久久综合中文成人网| 日本久久久久久中文字幕| 精品久久久久久亚洲| 91久久精一区二区三区大全| 国产精品久久久福利| 国产午夜福利精品久久2021| 国产精品久久久久久久久鸭| 久久er99热精品一区二区|