Delphi Seattle:释放我创建的对象时,为何总遭遇无效指针操作之迷?

2026-04-10 16:362阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计809个文字,预计阅读时间需要4分钟。

Delphi Seattle:释放我创建的对象时,为何总遭遇无效指针操作之迷?

在使用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行 – 第一个代码片段)并希望最好.这完全不是我正确编码的理念!

我是以错误的方式去做的吗?

注意:我显然不使用指针.

Delphi Seattle:释放我创建的对象时,为何总遭遇无效指针操作之迷?

任何帮助,将不胜感激!

很明显,您正在释放贷款对象两次,这就是您收到错误的原因.你只需要释放一次. fmLoanRequests创建对象,但是你说它可以在fmLoan关闭之前关闭,所以fmLoan应该取得对象的所有权并在fmLoan关闭时释放它. fmLoanRequest关闭时,不要释放对象.

另一种方法是定义TLoan和后代实现的ILoan接口,然后直接传递ILoan而不是TLoan.接口是引用计数的,因此在fmLoanRequests和fmLoan都释放了对它的引用之后,Loan对象将自动释放,并且只会被释放一次.

标签:对象

本文共计809个文字,预计阅读时间需要4分钟。

Delphi Seattle:释放我创建的对象时,为何总遭遇无效指针操作之迷?

在使用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行 – 第一个代码片段)并希望最好.这完全不是我正确编码的理念!

我是以错误的方式去做的吗?

注意:我显然不使用指针.

Delphi Seattle:释放我创建的对象时,为何总遭遇无效指针操作之迷?

任何帮助,将不胜感激!

很明显,您正在释放贷款对象两次,这就是您收到错误的原因.你只需要释放一次. fmLoanRequests创建对象,但是你说它可以在fmLoan关闭之前关闭,所以fmLoan应该取得对象的所有权并在fmLoan关闭时释放它. fmLoanRequest关闭时,不要释放对象.

另一种方法是定义TLoan和后代实现的ILoan接口,然后直接传递ILoan而不是TLoan.接口是引用计数的,因此在fmLoanRequests和fmLoan都释放了对它的引用之后,Loan对象将自动释放,并且只会被释放一次.

标签:对象