我使用Delphi西雅圖。德爾福西雅圖:我釋放我創建的對象時得到無效指針操作
當我嘗試釋放我創建的對象時發生問題。
我在本網站(以及其他網站)搜索了已發佈的問題答案,但它們都有所不同。根據這些討論,我的代碼應該可以工作,但顯然有些事情是不正確的。
所以,我需要幫助...
流執行的:
一)在形式上fmLoanRequest,我創建基於類TStorageLoan(對象的子類TLoan的)。構造函數將所有類型的值加載到對象的某些屬性中(現在在此處顯示)。
b)稍後,我將該對象的地址傳遞給另一個窗體(fmLoan)以適當的公共變量。 fmLoan是所有用戶與貸款內容發生交易的形式。請注意,fmLoanRequest在我們處於fmLoan狀態時保持不變。當fmLoan關閉時,我們將返回fmLoanrequest。
c)顯示fmLoan表單(並顯示對象中的數據 - 所有工作正常)。
d)當關閉fmLoan,一個過程被調用以釋放貸款對象 - 如果它被分配(見行10秒的代碼片段)。這似乎工作正常(沒有錯誤)。 e)當執行下面第14行中的代碼時,出現'無效指針操作'錯誤:(如果分配(oLoan)然後oLoan.Free;)。
我已經添加了這一行,以確保如果fmLoan沒有出於某種原因處理它,該對象將被釋放。我意識到這個對象已經被釋放了,但是不應該'如果Assgned()'阻止了對象的不必要的釋放?
偏碼從形式fmLoanRequest(I加入一些供參考的行號)
1 // In form fmLoanRequest
2 // Create new Loan Object (from a Loan sub-class as it happens)
3 // Create the object here; Object address will be passed to fmLoan later for handling.
4 oLoan := TStorageLoan.Create(iNewLoanID);
5 ...
6 ...
7 fmLoan.oLoan := oLoan; // pass the address to the other form
8 fmLoan.show;
9 // User would click the 'btnClose' at this point. See event code below.
10 ...
11 ...
12 procedure TfmLoanRequests.btnCloseClick(Sender: TObject);
13 begin
14 if Assigned(oLoan) then oLoan.Free; // <--- ERROR HERE
15 fmLoanRequests.Close;
16 end;
偏碼從形式fmLoan(I加入一些供參考的行號)
1 //Form fmLoan
2 ...
3 public
4 oLoan : TLoan;
5 ...
6 // In form fmLoan, I call the following upon closing the Form
7 // in the OnClick event of the 'btnClose' button.
8 Procedure TfmLoan.Clear_Loan_Object;
9 begin
10 if Assigned(oLoan) then oLoan.Free; // <-- THIS WORKS FINE
11 end;
我應該嘗試一種不同的方法嗎?
我應該只刪除該行(第14行 - 第一個代碼片段),並希望最好。這不符合我的正確編碼理念!
我會以錯誤的方式去做嗎?
注:我顯然不使用指針。
任何幫助,將不勝感激!
[爲什麼我在使用或釋放事物之前不應該使用「if Assigned()」?](http://stackoverflow.com/q/8548843/327083) –
您可以在所有地方始終使用FreeAndNil(oLoan)你在哪裏使用oLoan.free。通過這種方式,您對Assigned(oLoan)的測試將在您期望時返回true。 – nolaspeaker