我必须遵循代码:
class Timer;
typedef boost::signals2::signal<void (void)> signal_type;
void Timer::create(long expiration, signal_type::slot_type const& slot);
它的正常用法是调用,
timer.create(2000, boost::bind(&some_callback));
并且可以正常工作。
但是,现在我需要经常“重新启动”这个计时器,这需要大量调用 boost::bind(&some_callback) ——我不想这样做,因为这似乎浪费了 CPU。
我想调用一次 boost::bind,然后重用它在随后调用 create() 函数时返回的任何内容。我不确定这是否可行。我可以想象它会泄漏内存,更糟糕的是,使用释放的内存并崩溃或其他东西。
我认为以上信息应该足以给出一般性答案,但让我添加有关此“创建”功能的确切作用的信息。
调用 create() 的效果是使用 new 创建了一个对象“Signal”,其中 Signal 是:
struct Signal {
signal_type mSignal;
};
然后将 mSignal 连接到传递给创建的槽值:
mCallback = new Signal;
mCallback->mSignal.connect(slot);
当我必须“重新启动”计时器时(在它到期之前),我首先调用 cancel() 函数,然后再次调用 create()。函数 cancel() 有效地调用了 'delete mCallback' - 因此,除了释放上面的 'new' 调用分配的内存之外,没有做任何其他事情。
因此,我猜想存储 boost::bind 的返回值并有效地重复使用它归结为:
signal_type::slot_type slot(boost::bind(&callback));
while (--several_times)
{
signal_type* signal = new signal_type;
signal->connect(slot);
delete signal;
}
这是否允许,或者对“连接”和删除的调用对“插槽”做一些事情,所以我不能在没有副作用的情况下重复使用它?