2017-07-03 94 views
0

我创建了下面的例子与波科计时器:如何将Poco :: SharedPtr传递给TimerCallback函数?

TimerExample example; 
Timer timer(250, 500); 
timer.start(TimerCallback<TimerExample>(example, &TimerExample::onTimer)); 

不过,我对我的情况TimerExample需要一个波科:: SharedPtr作为

Poco::SharedPtr<TimerExample>TimerExample; 

TimerCallback的构造采用下列参数:

TimerCallback(
    C & object, 
    Callback method 
); 

其中C是模板类<TimerExample>对于我们的情况。
我想知道如何在波苏:: SharedPtr传递给TimerCallback功能,以便与来自相关POCO指南030 MemoryManagement.pdf子弹一致的在那里说:

一旦您使用SharedPtr作为对象,而不再使用纯指针 再次对该对象。

+0

这看起来很奇怪;由于'TimerCallback'构造函数引用了'TimerExample'实例,所以无论您做什么,都无法将共享指针传递给它(您总是会得到一个引用,而您需要保留共享指针的副本)。我想你需要派生一个'TimerCallback'子代,它可以保留共享指针的副本,并在时机成熟时调用其祖先的方法来执行回调... – vencik

回答

0

正如vencik在评论中指出的 - 你不能。就目前而言,您只能传入对具有回叫作为成员的对象的引用,并且您必须确保它在TimerCallback实例的生命周期中有效 - 您的回调可以是您可以拒绝传入的SharedPtr,但TimerCallback将采用其地址,并且不会在别处共享它。

+0

感谢您的回应。关于SharedPtris的自动删除,上面的处理可能会导致任何可能导致内存泄漏的异常情况? – dk13

+0

我能想到的唯一事情就是上面已经提到的:在最后一个SharedPtr实例持有指向它的指针被破坏后,不要访问'TimerExample'。 – Alex