Как правильно использовать возвращаемое значение вызова boost :: bind?

0

Я должен следовать следующему коду:

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). Я не хочу этого делать, потому что это кажется пустой тратой процессора.

Я хотел бы сделать вызов boost :: bind один раз, а затем повторно использовать все, что он вернул при последующем вызове функции create(). Я не уверен, может ли это работать. Я могу себе представить, что это приведет к утечке памяти и еще хуже, к использованию освобожденной памяти и сбоя или чего-то еще.

Я думаю, что приведенное выше должно быть достаточной информацией, чтобы дать общий ответ, но позвольте мне добавить информацию о том, что именно делает эта функция "create".

Эффект вызова create() заключается в том, что объект "Signal" создается с новым, где Signal:

struct Signal {
    signal_type mSignal;
};

и затем mSignal подключается к значению слота, переданному для создания:

mCallback = new Signal;
mCallback->mSignal.connect(slot);

Когда мне нужно "перезапустить" таймер (до истечения срока его действия), я сначала вызываю функцию cancel(), а затем снова вызываю create(). Функция cancel() эффективно вызывает "delete 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;
}

Это разрешено или звонки "подключиться" и "удалить" делают что-то "слот", поэтому я не могу повторно использовать его без побочных эффектов?

  • 0
    «Тем не менее, теперь мне нужно многократно« перезапускать »этот таймер, что потребовало бы много вызовов для boost :: bind (& some_callback) - я не хочу этого делать, потому что это кажется пустой тратой процессора». Магия boost::bind выполняется во время компиляции; Вы не платите за дополнительные циклы процессора, чтобы связать его снова.
Теги:
boost
boost-bind
boost-signals2

1 ответ

1

В целом,

  • bind выражения довольно легкие (компилятор обычно встраивает весь shebang)
  • bind выражения копируют связанные параметры, но это легко смягчается, делая boost::bind(&MyClass::fpp, boost::ref ( object))
  • boost::function<> и std::function<> идеально подходят для хранения связанных выражений:

    boost::function<void()> stored_bind = 
          boost::bind(&MyClass::fpp, boost::ref(object));
    

Ещё вопросы

Сообщество Overcoder
Наверх
Меню