销毁后无法在 AHK 中创建类
Posted
技术标签:
【中文标题】销毁后无法在 AHK 中创建类【英文标题】:Cannot create class in AHK after destruction 【发布时间】:2018-01-11 07:56:26 【问题描述】:我正在尝试围绕 AHK 的课程进行学习。我是 C++ 开发人员,所以想使用 RAII(__New
、__Delete
),但看起来我错过了一些概念,因为这对我来说看起来非常违反直觉。
经过一些尝试,我想出了这个简单的例子:
class Scenario
__New()
MsgBox, NEW
__Delete()
MsgBox, DELETE
scenario := new Scenario
scenario := new Scenario
scenario := 1
scenario :=
scenario := new Scenario
Return
因此,我收到以下消息:
-
新
新
删除
删除
问题:
-
为什么在第二次分配期间对象没有被销毁?我会假设 refs 的数量为 0,不是吗?
我怎么会连续收到 2 次破坏?同时该对象存储在哪里?
scenario
变量如何同时保存两个引用?
为什么不调用第三个构造?
【问题讨论】:
【参考方案1】:为什么在第二次分配期间对象没有被销毁?
尚未触发垃圾回收
我假设 refs 的数量会变为 0,不是吗?
到 0 的引用不一定会触发 GC
我怎么会连续 2 次破坏?
垃圾回收同时清理了两个引用
同时该对象存储在哪里?
堆
场景变量如何同时保存两个引用?
scenario
不包含两个引用
为什么不调用第三个构造?
只构造了两个 Scenario 对象。变量scenario
是一个动态变量,并不总是Scenario
类的实例。最后一个赋值 scenario :=
只是创建了一个空对象。
【讨论】:
好的,我想我忘了在最后添加一行 - 在返回之前再添加一行scenario := ...
- 更新了代码。看起来分配给
会触发垃圾收集,之后我无法再创建新对象。这仍然不能回答为什么当 ref 计数器变为零时它没有被收集。您是否有描述整个垃圾收集的文档的链接?【参考方案2】:
好的,找出丢失的内容。两件事:
-
AHK 脚本不区分大小写。
由于
class
在 AHK 中本身就是一个对象,因此可以用另一个对象覆盖该类。
Here 是文档的一部分:
因为类是通过变量引用的,所以类名不能同时用于引用类和在同一上下文中创建单独的变量(例如保存类的实例)。例如,
box := new Box
会将 Box 中的类对象替换为自身的一个实例。 [v1.1.27+]:#Warn ClassOverwrite
允许在每次尝试覆盖类时在加载时显示警告。
这解释了上面代码中发生的事情:变量名scenario
实际上与类名Scenario
相同,所以我只是悄悄地用一个空对象覆盖了我的类。
另外,由于类的新实例是在分配之前创建的,所以我连续得到两个“NEW”,只有“DELETE”。
【讨论】:
以上是关于销毁后无法在 AHK 中创建类的主要内容,如果未能解决你的问题,请参考以下文章