Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop MATLAB-涉及定时器时对象未清除_Oop_Matlab_Timer - Fatal编程技术网

Oop MATLAB-涉及定时器时对象未清除

Oop MATLAB-涉及定时器时对象未清除,oop,matlab,timer,Oop,Matlab,Timer,这有点关联,但不完全相关 我有两个类,FunctionWrapper和TimerWrapper: classdef FunctionWrapper < handle methods function Fcn(obj) disp('FunctionWrapper.Fcn was called!'); end end end classdef TimerWrapper < handle properties

这有点关联,但不完全相关

我有两个类,
FunctionWrapper
TimerWrapper

classdef FunctionWrapper < handle
    methods
        function Fcn(obj)
            disp('FunctionWrapper.Fcn was called!');
        end
    end
end

classdef TimerWrapper < handle
    properties
        Timer
    end

    methods
       function obj = TimerWrapper(other_object)
            obj.Timer = timer;
            set(obj.Timer, 'Period', 1);
            set(obj.Timer, 'ExecutionMode', 'fixedSpacing');
            set(obj.Timer, 'TimerFcn', @(event, data) other_object.Fcn);
       end

       function start(obj)
           start(obj.Timer);
       end

       function stop(obj)
           stop(obj.Timer);
       end

       function delete(obj)
           disp('destructor called!');
           delete(obj.Timer);
       end
    end
end

这是怎么回事?我知道需要手动删除
timer
对象,但我认为这将在
timerRapper
的析构函数中处理。在不使用的情况下,是否有方法从工作区
清除T
?此外,没有任何东西是指
T
,那么为什么存在对它的引用呢?(从未调用析构函数这一事实意味着这一事实。)这是否隐藏在计时器对象本身中?

似乎这可能是因为计时器的回调设置为非默认值。(请参阅链接线程的消息#4)仅在调用
start
方法时设置回调函数,然后在调用
stop
方法时将其设置为null。

如果键入
t=TimerWrapper;f=函数(t.Timer.TimerFcn);f、 工作区(2)
,您将看到用于回调的匿名函数的工作区包含对
timerRapper
对象本身的引用。所以这里有一种循环引用,
clear
无法获取

T.delete
clear T
根据您的设置方式,可以通过显式调用析构函数,然后调用
clear
来删除
T
(及其底层计时器对象)

T.delete
clear T
clear
delete
之间的区别有点让人困惑(无论如何,对我来说)。正如您所发现的,
clear
不会显式调用析构函数。它只是从工作区中删除名称
T
。因此,
T
,以及它的底层计时器,在这一点上仍然存在。如果它们不包含对仍然存在的事物的引用,那么MATLAB将正确地删除
T
,包括调用其析构函数。实际上,由于计时器包含对
T
的引用(在其回调中),该引用仍然存在,因此不会删除计时器(因此也不会删除
T

您可以使用
timerfindall
找到它(尽管工作区中没有名称),如果您使用

tmrs = timerfindall;
delete(tmrs);
您会发现
T
现在已正确消失

我不太确定这是否是一个bug,尽管我发现它非常令人困惑,而且
清除
删除
之间的区别可能会得到更好的记录

至于解决方法,我不觉得显式调用
delete
是一件很痛苦的事,尽管如果你不小心调用
clear
,清理东西会有点痛苦。我认为你链接到的信息5中的建议,而不是信息4中的建议,会更全面、更有力


我认为您不应该在链接到的单独线程中以@Amro的方式重载
clear
:虽然如果显式调用
clear t
,这可能会起作用,但如果调用
clear all
clear variables
,您仍然可能会遇到麻烦。(我刚才还没有尝试过,但我相信
clear
的这些语法甚至不会在工作区中循环并调用
clear
,而是调用内部MATLAB工作区对象的
clear
方法,这很快就会让人困惑).

实际上,我完全删除了对
F
的引用,只是在回调中使用了
disp
来测试这一点。它自己仍然不能正确地清除。但是如果你键入t.delete,然后键入clear t,它就可以正常工作了,对吗?是的,它可以。这是正确的方法,但是我的代码库很大,我的用户(实际上,大多数MATLAB用户)不知道
delete
clear
是两件不同的事情。无论如何,我仍在试图理解为什么使用
TimerFcn
会产生这种行为(假设它不是bug,我认为是)。好吧,我想我有一个更清楚的解释。制作一个版本的
timerRapper
,将
@(~,~)disp('hello')
作为
TimerFcn
,然后键入
t=timerRapper
。现在键入
f=functions(t.Timer.TimerFcn)
f.workspace(2)
。您将看到用于计时器回调的匿名函数的工作区包含对TimerRapper对象本身的引用。因此,这里有一种循环引用(无论是否引用了
F
),它不会被
clear
获取。如果您编辑您的答案以包含该信息,我将授予复选标记+50奖金!