В Qt5 есть замечательная штука — новые сигнал-слоты. Помимо значительного ускорения работы, у них не происходит «нормализации», а значит, что данные, которые передаются по ссылке, будут переданы действительно по ссылке, а не с использованием копирующего конструктора или оператора присваивания. Поправьте, если я ошибаюсь.
Но здесь проблема. Создадим объект в стеке и пошлем его по ссылке через сигнал-слоты:
void mysignal(const Foo &);
//...
Foo foo;
emit mysignal(foo);
При передаче в пределах одного треда всё будет ок, так как объект разрушиться после вызова сигнала и привязанных слотов.
При передаче между разными тредами часто будет сегфолт, если обращение к объекту в слоте в принимающем потоке будет позже его разрушения в вызывающем.
Вопросы: Как элегантно этого избежать?
Как сделать, чтобы передача данных была одинаково эффективная и внутри одного потока и между потоками?
Лично я вижу выход в использовании:
- Указатели и создание в куче. Плюсы — никаких накладных расходов. Минусы — нужно следить за жизнью объекта.
- Смарт-поинтеры. Плюсы — не нужно помнить про необходимость разрушения объекта, ну и минимальные накладные расходы. Минусы — код не красивый.
- Использование Implicit Sharing и передача данных по значению. Код красивый, но не всегда можно переделать классы.
В общем, мне пока больше всего нравятся смарт-поинтеры.
Можно ли как-то выкрутится с помощью rvalue?