|
|
1
12
你应该把create从try finally块中去掉。 但更好的解决方案是:
|
|
|
2
4
评论中提出了一些问题,我想澄清一下。 首先是持续存在的误解,即构建者需要是虚拟的。确实如此 不 请考虑以下示例:
创建的对象将是类的完整实例
在需要虚拟构造函数之前,必须满足两个条件:
重要的是要意识到,这两条规则与决定何时使任何其他方法虚拟化的因素没有什么不同。建筑商在这方面并不特别。 构造函数知道构造哪个类,不是基于定义构造函数的类,而是基于调用构造函数的类。每次调用构造函数时,该类总是作为隐藏的第一个参数传递。
二是是否
简单明了,但这行不通。
为此,它使用了两步构造技术。首先,分配内存并将引用分配给全局变量:
接下来,调用实例上的构造函数,传递
It's my opinion
那
第三个概念是,一个对象调用自身的构造函数是不寻常的。
事实上,这种情况确实会发生
总是
。每次调用继承的构造函数时,都是在调用已存在对象的构造函数。继承的构造函数没有分配新对象。同样,VCL也有一些构造函数的非继承调用的例子。
|
|
|
3
2
关于Create()引发异常时内存泄漏的问题:你应该自己尝试一下。我刚刚在Delphi2007上做了这项工作,在您的代码中,FastMM4显示了一个错误对话框,内容是尝试在已释放的对象上调用虚拟方法,即Destroy()。因此,Create中的异常已经导致析构函数被调用,内存被释放,所以你的代码实际上是错误的。坚持使用成语 answer by Gamecat ,一切都应该工作。 编辑: 我刚刚在Delphi 4上进行了测试,其表现与之前相同。测试代码:
对于FastMM4,finally块中的Free会给出相同的错误,因为C已经被释放了。不过,在应用程序关闭时,异常和异常字符串会被报告为内存泄漏。然而,这不是代码的问题,而是运行时的问题。 |
|
|
4
2
编辑: 不完全记得在旧的delphi版本中是怎么回事,但显然这应该在所有其他回复的基础上都能工作。 注意,从我记事起,Create就一直在失败时调用Destroy。它不应该在我想之后。 代码为:
我删除了原始函数返回的结果,因为它永远不会为false,只能为“未赋值”(异常)或true。毕竟,在将结果赋值为false之前,您可能会遇到异常。 ;) |
|
|
simply lemon · python上链表的添加方法 1 年前 |
|
|
Anonymous · 为什么在这个例子中self和类名的用法不同? 1 年前 |
|
|
P N Singh · 在CPP Oops中调用对象而不创建它 1 年前 |
|
|
Muthuraj · 如何创建一个通用工厂来创建某种类型的实例[重复] 1 年前 |
|
|
Andy Votava · 从父类定义调用学生方法 1 年前 |