四轴飞控8——处理飞行状态
2026/6/26 4:08:44
private: std::function<void()> lambdaSlot;lambdaSlot = []() { qDebug() << "Lambda slot executed"; // 可访问类成员(如this指针) };#include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); qDebug() << "Lambda slot executed1"; std::function<void()> lambdaSlot1; lambdaSlot1 = []() { qDebug() << "Lambda slot executed 临时"; // 可访问类成员(如this指针) }; lambdaSlot2 = []() { qDebug() << "Lambda slot executed"; // 可访问类成员(如this指针) }; lambdaSlot = &lambdaSlot1; qDebug() << lambdaSlot; connect(ui->pushButton_2,&QPushButton::clicked,lambdaSlot1); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_pushButton_clicked() { (*lambdaSlot)(); // lambdaSlot2(); }lambda信号槽是独立的,即使使用std::function<void()> lambdaSlot1;生成对象在转为槽函数,也是不行的,因为,在传入的过程中生成了另一个对象
证明过程
现象,pushButton_2点击有效,pushButton点击直接死机
在Qt C++中,lambda 槽函数的生命周期不直接与信号发送对象绑定,而是取决于lambda 本身的捕获方式和接收对象(receiver)的生命周期
connect(sender,&Sender::signal,[](){qDebug()<<"No capture";});sender被销毁,连接会自动断开(Qt 默认行为),但 lambda 本身仍然有效(如果被其他地方引用)。intvalue=42;connect(sender,&Sender::signal,[value](){qDebug()<<"Captured value:"<<value;});receiver(接收对象)是this(当前对象):receiver的内部数据结构中(如QObjectPrivate)。receiver被销毁时,Qt 会自动断开所有相关连接,避免悬空引用。receiver是另一个对象:receiver对象的生命周期。receiver先被销毁,而sender仍然存在,可能会导致未定义行为(除非手动管理连接)。QPointer或shared_ptr管理生命周期如果 lambda 捕获了指针或引用,建议使用智能指针或QPointer防止悬空引用:
QPointer<QObject>safeObj=someObj;connect(sender,&Sender::signal,[safeObj](){if(safeObj){qDebug()<<"Object still exists";}});sender)的影响AutoConnection(自动选择DirectConnection或QueuedConnection)。sender被销毁:sender发出的连接都会被自动断开(Qt 内部管理)。| 场景 | 生命周期管理 | 风险 |
|---|---|---|
| 无捕获 Lambda | 独立于任何对象 | 无悬空风险 |
有捕获 Lambda +receiver是this | 由receiver(this) 管理 | receiver销毁时自动断开 |
有捕获 Lambda + 外部receiver | 由receiver管理 | 如果receiver先销毁,可能导致悬空 |
| 捕获原始指针/引用 | 需手动管理(如QPointer) | 悬空引用风险 |
receiver对象,而不是信号发送对象。sender和receiver之间的连接,但有捕获的 lambda 仍需手动管理悬空引用。this作为receiver,或使用智能指针确保安全。所以,使用lambda槽函数,一定要确保是一次性的,不会循环创建的,否则,不保证是否会有内存泄漏!