Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.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
C++ C++;:析构函数级联期间的回调和系统计时器事件_C++_Timer_Oop_Object Destruction - Fatal编程技术网

C++ C++;:析构函数级联期间的回调和系统计时器事件

C++ C++;:析构函数级联期间的回调和系统计时器事件,c++,timer,oop,object-destruction,C++,Timer,Oop,Object Destruction,假设一个OO设计,其中对象相互调用,一段时间后被调用的对象回调初始对象(调用和回调)。在正常的程序终止期间,当调用析构函数时,是否有某种承诺,即不会调用系统计时器,也不会有对象启动回调?不,没有这种保证 您需要编写代码,以便在使用完对象之前不会销毁它们。不,没有这样的保证 您需要编写代码,使对象在使用完毕之前不会被破坏。 boost的弱_ptr通常可以帮助避免从回调中访问被破坏的对象,因此在终止期间也可能如此。使用此选项时,所有需要回调的对象都需要一个共享的\u ptr 调用函数/回调的计时器通

假设一个OO设计,其中对象相互调用,一段时间后被调用的对象回调初始对象(调用和回调)。在正常的程序终止期间,当调用析构函数时,是否有某种承诺,即不会调用系统计时器,也不会有对象启动回调?

不,没有这种保证


您需要编写代码,以便在使用完对象之前不会销毁它们。

不,没有这样的保证

您需要编写代码,使对象在使用完毕之前不会被破坏。

  • boost的弱_ptr通常可以帮助避免从回调中访问被破坏的对象,因此在终止期间也可能如此。使用此选项时,所有需要回调的对象都需要一个共享的\u ptr
  • 调用函数/回调的计时器通常是高端库,因此这取决于它们是否支持stopAllTimers()功能。如果您可以控制库,那么实现它可能并不太困难,但您仍然需要知道何时触发它
      • boost的弱_ptr通常可以帮助避免从回调中访问被破坏的对象,因此在终止期间也可能如此。使用此选项时,所有需要回调的对象都需要一个共享的\u ptr
      • 调用函数/回调的计时器通常是高端库,因此这取决于它们是否支持stopAllTimers()功能。如果您可以控制库,那么实现它可能并不太困难,但您仍然需要知道何时触发它

        • 不,没有承诺

          有两种方法可以处理此问题:

          • 具有一个对象可以在销毁时调用的注销函数,该函数保证在对象终止后不会调用回调-
            CancelAllCallbacks()
            或类似函数

          • 使用弱引用机制,如前面提到的弱ptr,仅在成功获取强引用时调用回调


          通常,第一个选项就足够了,除非可以异步调度或调用回调-那么您就没有同步的方法来阻止已经计划调用的回调,或者实际上正在另一个线程中调用的回调(或者从现在起调用一些指令)。

          不,没有承诺

          有两种方法可以处理此问题:

          • 具有一个对象可以在销毁时调用的注销函数,该函数保证在对象终止后不会调用回调-
            CancelAllCallbacks()
            或类似函数

          • 使用弱引用机制,如前面提到的弱ptr,仅在成功获取强引用时调用回调


          通常,第一个选项就足够了,除非可以异步调度或调用回调-那么您就没有同步的方法来阻止已经计划调用的回调,或者实际上现在正在调用的回调(或者以后的一些指令)在另一个线程中。

          有一个非常棒的库来处理这类调用,当然它是一个增强库

          注意,即使在多线程应用程序中也能保证正确性:)

          请特别注意使用了
          boost::trackable
          类,以便对象销毁在调用发生之前自动使其失效


          注意:Boost.Signals(它的祖先)具有几乎相同的功能,但不是线程安全的

          有一个非常棒的库来处理这类调用,当然它是一个Boost库

          注意,即使在多线程应用程序中也能保证正确性:)

          请特别注意使用了
          boost::trackable
          类,以便对象销毁在调用发生之前自动使其失效


          注意:Boost.Signals(其前身)具有几乎相同的功能,但不是线程安全的

          是,如果不注意正确的对象清理,所描述的场景通常会导致程序故障。是的,如果不注意正确的对象清理,所描述的场景通常会导致程序故障。