当我尝试释放我创建的对象时,会出现问题.
我在这个网站(以及其他网站)中搜索了已经发布的这个问题的答案,但它们都有点不同.根据这些讨论,我的代码应该可行,但显然有些事情是不对的.
所以,我需要帮助……
执行流程:
a)以fmLoanRequest的形式,我基于Class TStorageLoan(TLoan的一个子类)创建一个对象.构造函数将所有类型的值加载到对象的某些属性中(现在显示在此处).
b)稍后,我将对象的地址传递给另一个形式(fmLoan)到适当的公共变量. fmLoan是所有用户与贷款内容交易的形式.请注意,当我们在fmLoan中时,fmLoanRequest保持不变.当fmLoan关闭时,我们将返回fmLoanrequest.
c)显示fmLoan表单(并显示对象中的数据 – 所有工作正常).
d)当关闭fmLoan时,调用一个过程来释放Loan对象 – 如果已分配(参见第二个代码片段的第10行).这似乎工作正常(没有错误).
e)执行下面第14行中的代码时发生’无效指针操作’错误:(如果已分配(oLoan)则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行 – 第一个代码片段)并希望最好.这完全不是我正确编码的理念!
我是以错误的方式去做的吗?
注意:我显然不使用指针.
任何帮助,将不胜感激!
很明显,您正在释放贷款对象两次,这就是您收到错误的原因.你只需要释放一次. fmLoanRequests创建对象,但是你说它可以在fmLoan关闭之前关闭,所以fmLoan应该取得对象的所有权并在fmLoan关闭时释放它. fmLoanRequest关闭时,不要释放对象.另一种方法是定义TLoan和后代实现的ILoan接口,然后直接传递ILoan而不是TLoan.接口是引用计数的,因此在fmLoanRequests和fmLoan都释放了对它的引用之后,Loan对象将自动释放,并且只会被释放一次.