【发布时间】:2014-11-14 22:45:38
【问题描述】:
我必须遵循以下代码:
class Timer;
typedef boost::signals2::signal<void (void)> signal_type;
void Timer::create(long expiration, signal_type::slot_type const& slot);
that的正常用法是调用,
timer.create(2000, boost::bind(&some_callback));
并且可以正常工作。
但是,现在我需要“重新启动”这个计时器很多次,这需要多次调用 boost::bind(&some_callback) ——我不想这样做,因为这似乎是对 CPU 的浪费。
我想调用一次 boost::bind,然后重用它在随后调用 create() 函数时返回的任何内容。我不确定这是否可行。我可以想象它会泄漏内存,更糟糕的是,使用释放的内存并崩溃或其他什么。
我认为以上信息应该足以给出一般性答案,但让我添加有关此“创建”功能的确切作用的信息。
调用create()的效果是用new创建了一个对象'Signal', 其中信号是:
struct Signal {
signal_type mSignal;
};
然后mSignal连接到传递给create的槽值:
mCallback = new Signal;
mCallback->mSignal.connect(slot);
当我必须“重新启动”计时器时(在它到期之前),我首先调用 cancel() 函数,然后再次调用 create()。函数取消() 有效地调用“删除 mCallback” - 所以,不做任何其他事情 而不是释放上面的“新”调用分配的内存。
因此,我想存储 boost::bind 的返回值并有效地重复使用它归结为:
signal_type::slot_type slot(boost::bind(&callback));
while (--several_times)
{
signal_type* signal = new signal_type;
signal->connect(slot);
delete signal;
}
这是允许的,还是调用“连接”和删除对“插槽”做一些事情,这样我就不能在没有副作用的情况下重复使用它?
【问题讨论】:
-
"但是,现在我需要'重新启动'这个计时器很多,这将需要大量调用 boost::bind(&some_callback) -- 我不想这样做,因为看起来很浪费CPU。”
boost::bind的魔力是在编译时完成的;您无需支付额外的 CPU 周期来再次绑定它。
标签: c++ boost boost-bind boost-signals2