Давайте рассмотрим этот простой пример:Безопасно ли излучать сигнал, передавая указатель QObject как параметр прямо перед тем, как переданный объект будет уничтожен?
Class Emitter: public QObject {
...
signal:
surfaceDestroyed(QObject*);
public:
void emittingMethod(QObject* surface) {
emit surfaceDestroyed(surface);
delete surface;
}
}
У меня есть соединение с очередями для этого случая
connect(emitterObject, SIGNAL(surfaceDestroyed(QObject*), receiverObject,
SLOT(onSurfaceDestroyed(QObject*)), Qt::QueuedConnection);
В onSurfaceDestroyed методе получил QObject разыменовывается и используется
Таким образом, вопрос, насколько безопасно этот код? Я прочитал довольно много информации об этом на сайте QT и здесь, но у меня все еще нет четкого понимания проблемы.
На мой взгляд этот код не является безопасным, так как сигнал может быть послан, а затем на поверхность разрушено, чем тогда, когда событие приходит receiverObject после того, как цикл событий обрабатывается и объект-получатель доступов выпустила память, таким образом, SIGSEGV
Это упрощенный пример реального кода, поэтому трудно отслеживать, могут ли из-за этого произойти сбой.
Я думаю, что вызов 'surface-> deleteLater();' будет еще более безопасным. – vahancho
Ну, как правило, если это плохо, не делайте этого. :-) Не было бы лучше, если бы деструктор разрушенного объекта делал то, что вы хотите сделать? –
@ vahancho да, я хотел упомянуть об deleteLater на вопрос, но, в конце концов, это сошло с ума. Как правило, это должно быть безопаснее, но я хотел бы быть на 100% уверенным, если этот код может или не может потерпеть крах. – rightaway717