在Matlab类对象的数组上调用delete

时间:2016-08-17 04:27:52

标签: matlab oop

如果MyObj是classdef,我有一个数组

objs = [MyObj(), MyObj()];

然后如果我打电话

delete(objs);

正如我所料,调用了MyObj的delete方法。 如果MyObj是handle的子类,则为数组中的每个对象调用delete方法。但是,如果它不是句柄的子类,则看起来整个数组都传递给delete方法。但是,我在文档中找不到这种行为,而我可以在文档中找到句柄行为。

这真的是我所看到的正确解释吗?处理这个问题的正常做法是什么?只是从句子中继承,或者在delete方法中检查一个数组并依次删除每个元素?继承句柄是否有缺点(除了具有引用语义之外)?对于非处理案例,是否有必须考虑的案例?

1 个答案:

答案 0 :(得分:3)

句柄类有一个名为delete析构函数方法。该方法由MATLAB隐式实现,但您可以自己重载它以实现自定义析构函数行为。

当需要销毁对象(不再在任何地方引用)或者可以由您显式调用时,MATLAB会隐式调用析构函数方法。它是为数组中的每个元素单独调用的(正如您所注意到的)。

值类没有析构函数方法。它们可能有一个名为delete的方法,但它就像任何其他方法一样(特别是,当对象被销毁时不会隐式调用它,并且不会为数组中的每个对象单独调用它。)

要强调最后一点,请在问题中创建objs,并使用值类数组。但是,不要明确地调用delete(objs),而是说objs = []。您会注意到虽然对象已被销毁,但您的delete方法根本没有被调用(因为尽管被称为delete,但它不是析构函数,因为它来自值类)

我不知道如何回答你的问题“处理这个问题的正常做法是什么”。如果需要析构函数,则需要使用句柄类。我无法想象你想要使用具有值类的析构函数的情况。

您可以在documentation中阅读更多内容。