我使用Delphi Seattle。
当我尝试释放我创建的对象时,出现了问题。
我已经在这个网站(以及其他网站)搜索了已发布的答案,但它们都有点不同。根据这些讨论,我的代码应该是可以工作的,但显然还有一些问题。
所以,我需要帮助……
执行流程:
a)在fmLoanRequest表单中,我基于TLoan类创建一个对象TStorageLoan(TLoan的子类)。构造函数将各种值加载到对象的某些属性中(此处未显示)。
b)稍后,我将对象的地址传递给另一个表单(fmLoan)的一个适当的公共变量。fmLoan是所有用户与贷款内容交易的表单。请注意,在我们进入fmLoan时,fmLoanRequest保持不变。当fmLoan关闭时,我们将返回fmLoanrequest。
c)显示fmLoan表单(并显示对象中的数据 - 所有这些都正常运行)。
d)关闭fmLoan时,调用一个过程来释放贷款对象 - 如果它被分配了(参见第二个代码片段的第10行)。这似乎没有问题(没有错误)。
e)当执行下面第14行的代码时,会出现“无效指针操作”错误:if Assigned(oLoan) then oLoan.Free;。
我添加了这行代码,以确保如果fmLoan由于某种原因没有处理对象,则对象将被释放。我意识到此时对象已经被释放,但是“if Assgned()”不应该防止不必要的释放对象吗?
来自表单fmLoanRequest的部分代码(我添加了一些行号以供参考)
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的部分代码(我添加了一些行号作为参考):
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行),然后希望一切都能正常。这并不是我的正确编码哲学!
我的做法是否有误?
注:我显然不使用指针。
任何帮助都将不胜感激!