在 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的主要内容,如果未能解决你的问题,请参考以下文章

[c++基础] delete 和 delete []的区别

在另一个类 MATLAB 中创建一个类的对象数组

new &&delete

allocator类

在 MATLAB 中加载对象

重载类的new和delete运算符成员函数