在 Matlab 类对象数组上调用 delete
Posted
技术标签:
【中文标题】在 Matlab 类对象数组上调用 delete【英文标题】:Calling delete on array of Matlab class objects 【发布时间】:2016-08-17 04:27:51 【问题描述】:如果 MyObj 是一个 classdef,并且我有一个数组
objs = [MyObj(), MyObj()];
如果我打电话给
delete(objs);
如我所料,调用了 MyObj 的删除方法。 如果 MyObj 从句柄子类化,则为数组中的每个对象调用 delete 方法。但是,如果它不是从句柄子类化的,那么似乎整个数组都传递给了 delete 方法。但是,我在文档中找不到这种行为,而我可以在文档中找到句柄行为。
这真的是对我所见的正确解释吗?处理这个问题的正常做法是什么?只是从句柄子类化,还是在 delete 方法中检查一个数组并依次删除每个元素?从句柄继承是否有缺点(除了具有引用语义之外)?对于非经办案件,是否有案件需要核算?
【问题讨论】:
【参考方案1】:句柄类有一个名为delete
的析构函数 方法。该方法由 MATLAB 隐式实现,但您可以自己重载它以实现自定义析构函数行为。
当需要销毁对象(不再在任何地方引用)时,MATLAB 会隐式调用析构函数方法,或者可以由您显式调用。它为数组中的每个元素单独调用(如您所见)。
值类没有析构方法。他们可能有一个名为delete
的方法,但它就像任何其他方法一样(特别是,它不会在对象被销毁时被隐式调用,也不会为数组中的每个对象单独调用)。
为了强调最后一点,请像您在问题中所做的那样创建objs
,并使用一组值类。但是,与其明确调用delete(objs)
,不如直接说objs = []
。您会注意到,尽管对象已被销毁,但您的 delete
方法根本没有被调用(因为尽管被称为 delete
,但它不是析构函数,因为它来自值类)。
我不确定如何回答您的问题“处理此问题的正常做法是什么”。如果需要析构函数,则需要使用句柄类。我真的无法想象你想要使用带有值类的析构函数的情况。
您可以在documentation阅读更多内容。
【讨论】:
以上是关于在 Matlab 类对象数组上调用 delete的主要内容,如果未能解决你的问题,请参考以下文章