2016-08-16 77 views
7

我寫了一個簡單的類是這樣的:對象釋放後對象是否安全使用?

TMyClass = class 
    procedure MyProcedure(Sender : TObject); 
end; 

我執行「MyProcedure」,在這裏我指的「自我」,對象已經被釋放後:

var 
    MyObj : TMyClass; 
    ProcOfObj : TNotifyEvent; 
begin 
    MyObj := TMyClass.Create; 
    try 
    ProcOfObj := MyObj.MyProcedure; 
    finally 
    MyObj.Free; 
    end; 

    ProcOfObj(Self); 
end; 

它的工作原理,但我想知道如果這是一個安全的做法,或者如果它可能會導致一些問題。

+2

如果該方法從不使用Self或任何字段,那麼它也可以聲明爲一個類方法,然後它是安全的*和*保護,以防止將來的修改,這將使其不安全 – mjn42

+0

@DavidHeffernan我用類替換靜態 – mjn42

回答

10

如果MyProcedure,以及它調用的任何方法,實際上並不是指Self實例,那麼您將不會遇到運行時錯誤。不過,這是一個有風險的遊戲。它只需要你對代碼做一些未來的改變,而不需要意識到這個問題,並且你進入了未定義的行爲領域。您可能會遇到運行時錯誤,或者您可能不會。編譯器不會拯救你。

你不想冒這個風險。所以,由於你的方法沒有引用一個實例,所以不要讓它成爲一個實例方法。

type 
    TMyClass = class 
    class procedure MyProcedure(Sender : TObject); 
    end; 

反而使它成爲一種類方法。這樣你就避免了風險,如果將來你會嘗試引用實例,編譯器會爲你節省。

3

這絕對是不是安全的做法。 只要過程試圖訪問自己對象的成員變量,就會收到訪問衝突。 不要在代碼中放置這樣的陷阱。你或你的團隊成員遲早會落入其中。

2

這是不安全的,它破壞了代碼封裝。

想象一下,如果最終你的執行TMyClass.MyProcedure改變並開始引用self?你會得到一個分段錯誤。

此外,您正在反對OOP,因爲您必須知道您要調用的方法的實現細節。

如果您要強制您的方法沒有引用Self指針,請將該方法聲明爲靜態成員。