gpt4 book ai didi

德尔福西雅图 : I get an Invalid Pointer operation when freeing an object I created

转载 作者:行者123 更新时间:2023-12-03 15:12:46 26 4
gpt4 key购买 nike

我使用德尔福西雅图。

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

我在此网站(以及其他网站)中搜索了已发布的针对此问题的答案,但它们都有点不同。根据这些讨论,我的代码应该可以工作,但显然有些事情不太正确。

所以,我需要帮助......

执行流程:

a) 在 fmLoanRequest 形式中,我创建一个基于 TStorageLoan 类(TLoan 的子类)的对象。构造函数将各种值加载到对象的某些属性中(现在显示在此处)。

b) 后来,我将对象的地址传递给另一个表单 (fmLoan) 的适当的公共(public)变量。 fMLoan 是用户与 Loan 内容进行所有处理的形式。请注意,当我们处于 fmLoan 状态时,fmLoanRequest 保持原样。当 fmLoan 关闭时,我们将返回 fmLoanrequest。

c) 显示 fmLoan 表单(并显示对象中的数据 - 所有这些都运行良好)。

d) 关闭 fmLoan 时,将调用一个过程来释放 Loan 对象 - 如果已分配该对象(请参阅第二代码段的第 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;

来自form 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 行 - 第一个代码片段)并希望得到最好的结果。这根本不是我关于正确编码的哲学!

我的做法是错误的吗?

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

如有任何帮助,我们将不胜感激!

最佳答案

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

另一种方法是定义一个由 TLoan 及其后代实现的 ILoan 接口(interface),然后传递 ILoan 而不是 TLoan 直接。接口(interface)采用引用计数,因此 Loan 对象将自动释放,并且仅在 fmLoanRequestsfmLoan 都释放对它的引用后释放一次。

关于德尔福西雅图 : I get an Invalid Pointer operation when freeing an object I created,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35758735/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com