在 Matlab 中为值 class 对象执行析构函数

Executing destructor for a value class object in Matlab

我需要在 Matlab 中控制对值 class 对象的销毁。 问题如下

我有一个程序(我们称它为 MyProg),它在执行期间创建一个值-class 对象(我们称它为 MyValClass)。 MyValClass 有一个 handle-class 对象作为其属性之一(我们称它为 MyHandClass)。该句柄 class 启动了一些 MyProg 监听的事件。

出现的问题是 MyValClass 对象被销毁(通常发生在异常或用户终止时)。我猜,因为仍然有监听器监听 MyHandClass 的事件,所以 MyHandClass 对象没有被销毁,并保留在内存中。

我想控制 MyValClass 对象的销毁,这样我就可以隐式删除它的 MyHandClass 属性。可能吗?

这里有一些关于句柄与值的背景知识 classes:

  1. 值 class 的对象不是 "destroyed",并且它们没有析构函数方法。当您设置 a = 1 时,将值 classes 的行为视为变量 a。当您键入 clear a 时,a 不是 "destroyed",只是不再有变量 a。值对象只是数据,如 1,它们不会被销毁。

  2. 即使值 class 有一个名为 delete 的方法,以上也是正确的。值 class 上的 delete 方法与任何其他方法一样。它不是析构函数,并且在清除变量时不会自动调用它。只有在您显式调用它时才会调用它。

  3. 总是处理classes,无论你是否实现一个,都有一个方法叫做delete,它是一个析构函数方法(即在对象被销毁时调用).如果你不实现一个,他们将被赋予一个名为 delete 的默认方法,该方法除了销毁对象外什么都不做。如果您实现 delete 方法,MATLAB 将在销毁对象时 运行 该方法。但是总有一个 delete 方法是析构函数,即使你没有实现一个。

所以 - 对于您的问题 - 如果您希望控制 MyValClass 的销毁,您必须将其更改为句柄 class。如果它是一个值class,它不会被销毁,也没有什么可控制的。

除了直接 "controlling the destruction",您还可以做其他事情。例如,您创建一个 onCleanup 对象。这是一个 class,除了在其销毁时执行用户指定的函数外什么都不做(它是一个句柄 class,因此它可以执行此操作)。因此,如果您的代码因异常或用户终止而退出,onCleanup 析构函数将执行。例如,您可以在其中放置一些代码,明确找到对 MyHandlClass 的引用并删除它们。

希望对您有所帮助!

值对象的析构函数可能是必需的,例如,如果 class 负责从文件访问数据并且您想在访问器超出范围时关闭文件。您不希望这样的 class 成为句柄 class 的原因有很多(例如,对象数组的奇怪行为)

其他原因是创建现有对象计数器。

我的解决办法是定义hidden 属性,delete_,然后把onCleanup(@()something)对象赋给这个属性。提供给 onCleanup 的函数将关闭文件、减少对象计数器等....