在 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:
值 class 的对象不是 "destroyed",并且它们没有析构函数方法。当您设置 a = 1
时,将值 classes 的行为视为变量 a
。当您键入 clear a
时,a
不是 "destroyed",只是不再有变量 a
。值对象只是数据,如 1
,它们不会被销毁。
即使值 class 有一个名为 delete
的方法,以上也是正确的。值 class 上的 delete
方法与任何其他方法一样。它不是析构函数,并且在清除变量时不会自动调用它。只有在您显式调用它时才会调用它。
总是处理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
的函数将关闭文件、减少对象计数器等....
我需要在 Matlab 中控制对值 class 对象的销毁。 问题如下
我有一个程序(我们称它为 MyProg
),它在执行期间创建一个值-class 对象(我们称它为 MyValClass
)。 MyValClass
有一个 handle-class 对象作为其属性之一(我们称它为 MyHandClass
)。该句柄 class 启动了一些 MyProg
监听的事件。
出现的问题是 MyValClass
对象被销毁(通常发生在异常或用户终止时)。我猜,因为仍然有监听器监听 MyHandClass
的事件,所以 MyHandClass
对象没有被销毁,并保留在内存中。
我想控制 MyValClass
对象的销毁,这样我就可以隐式删除它的 MyHandClass
属性。可能吗?
这里有一些关于句柄与值的背景知识 classes:
值 class 的对象不是 "destroyed",并且它们没有析构函数方法。当您设置
a = 1
时,将值 classes 的行为视为变量a
。当您键入clear a
时,a
不是 "destroyed",只是不再有变量a
。值对象只是数据,如1
,它们不会被销毁。即使值 class 有一个名为
delete
的方法,以上也是正确的。值 class 上的delete
方法与任何其他方法一样。它不是析构函数,并且在清除变量时不会自动调用它。只有在您显式调用它时才会调用它。总是处理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
的函数将关闭文件、减少对象计数器等....