【问题标题】:Cannot create class in AHK after destruction销毁后无法在 AHK 中创建类
【发布时间】: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

因此,我收到以下消息:

  1. 删除
  2. 删除

问题:

  1. 为什么在第二次分配期间对象没有被销毁?我会假设 refs 的数量为 0,不是吗?
  2. 我怎么会连续收到 2 次破坏?同时该对象存储在哪里? scenario 变量如何同时保存两个引用?
  3. 为什么不调用第三个构造?

【问题讨论】:

    标签: class object autohotkey construction destruction


    【解决方案1】:
    1. 为什么在第二次分配期间对象没有被销毁?

    尚未触发垃圾回收

    我假设 refs 的数量会变为 0,不是吗?

    到 0 的引用不一定会触发 GC

    1. 我怎么会连续 2 次破坏?

    垃圾回收同时清理了两个引用

    同时该对象存储在哪里?

    场景变量如何同时保存两个引用?

    scenario 不包含两个引用

    1. 为什么不调用第三个构造?

    只构造了两个 Scenario 对象。变量scenario 是一个动态变量,并不总是Scenario 类的实例。最后一个赋值 scenario := {} 只是创建了一个空对象。

    【讨论】:

    • 好的,我想我忘了在最后添加一行 - 在返回之前再添加一行 scenario := ... - 更新了代码。看起来分配给{} 会触发垃圾收集,之后我无法再创建新对象。这仍然不能回答为什么当 ref 计数器变为零时它没有被收集。您是否有描述整个垃圾收集的文档的链接?
    【解决方案2】:

    好的,找出丢失的内容。两件事:

    1. AHK 脚本不区分大小写。
    2. 由于 class 在 AHK 中本身就是一个对象,因此可以用另一个对象覆盖该类。

    Here 是文档的一部分:

    因为类是通过变量引用的,所以类名不能同时用于引用类和在同一上下文中创建单独的变量(例如保存类的实例)。例如,box := new Box 会将 Box 中的类对象替换为自身的一个实例。 [v1.1.27+]:#Warn ClassOverwrite 允许在每次尝试覆盖类时在加载时显示警告。

    这解释了上面代码中发生的事情:变量名scenario 实际上与类名Scenario 相同,所以我只是悄悄地用一个空对象覆盖了我的类。

    另外,由于类的新实例是在分配之前创建的,所以我连续得到两个“NEW”,只有“DELETE”。

    【讨论】:

      猜你喜欢
      • 2012-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-13
      • 2011-12-22
      • 1970-01-01
      • 2014-02-02
      相关资源
      最近更新 更多