今天在调试代码时遇到了一个有趣的问题,值得仔细思考。

QAction* pAction = new QAction;
QWidget* pWidget = new QWidget;

// connect demo1
QObject::connect(pAction, &QAction::triggered,
		 pWidget, [pWidget](QWidget* pWidget){
		     pWidget->show();
		     pWidget->raise();
		 });
// connect demo2
QObject::connect(pAction, &QAction::triggered,
		 [pWidget](QWidget* pWidget){
		     pWidget->show();
		     pWidget->raise();
		 });

比较上面两个 connect 代码段,它们的区别是什么呢?

  1. 从实现的功能来讲,它们没有区别。都能在信号触发时调用匿名函数。
  2. pWidget 被析构时,上面的demo1能够感知到信号接收端的系统,从而自动断开信号与槽的连接;而在demo2中,将无法自动断开信号槽的连接,这样会由于使用了悬空指针,最终导致程序崩溃。

(全文完)