当前位置 : 主页 > 编程语言 > delphi >

Delphi Seattle:在释放我创建的对象时,我得到一个无效的指针操作

来源:互联网 收集:自由互联 发布时间:2021-06-23
我使用Delphi Seattle. 当我尝试释放我创建的对象时,会出现问题. 我在这个网站(以及其他网站)中搜索了已经发布的这个问题的答案,但它们都有点不同.根据这些讨论,我的代码应该可行,但显
我使用Delphi Seattle.

当我尝试释放我创建的对象时,会出现问题.

我在这个网站(以及其他网站)中搜索了已经发布的这个问题的答案,但它们都有点不同.根据这些讨论,我的代码应该可行,但显然有些事情是不对的.

所以,我需要帮助……

执行流程:

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对象将自动释放,并且只会被释放一次.

网友评论