0

我需要控制 Matlab 中值类对象的破坏。问题如下。

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

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

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

4

2 回答 2

1

这是句柄与值类的一些背景知识:

  1. 值类的对象不会被“销毁”,它们也没有析构方法。当a你设置a = 1. a键入时不会“销毁” clear a,不再有变量a。值对象只是数据,例如1,它们不会被破坏。

  2. 即使值类有一个名为 的方法,上述情况也是如此delete。值类上的delete方法就像任何其他方法一样。它不是析构函数,并且在清除变量时不会自动调用。只有当您明确调用它时才会调用它。

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

所以 - 对于你的问题 - 如果你想控制 的破坏MyValClass,你必须改变它成为一个句柄类。如果它是一个值类,它不会被破坏,也没有什么可以控制的。

除了直接“控制破坏”之外,您还可以做其他事情。例如,您创建一个onCleanup对象。这是一个除了在销毁时执行用户指定的函数之外什么都不做的类(它是一个句柄类,所以它可以这样做)。因此,如果您的代码由于异常或用户终止而退出,onCleanup析构函数将执行。例如,您可以在其中放置一些代码,以显式查找对它们的引用MyHandlClass并删除它们。

希望有帮助!

于 2019-08-27T09:59:36.197 回答
0

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

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

我的解决方案是定义隐藏属性 delete_,并将onCleanup(@()something)对象分配给该属性。提供的功能onCleanup将关闭文件,递减对象计数器等......

于 2021-10-25T14:20:18.780 回答