- 主题:弱问关于lamda表达式的问题
#include <QApplication>
#include <QFileSystemModel>
#include <QTreeView>
#include <QDebug>
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
QFileSystemModel model;
model.setRootPath(QDir::currentPath());
QTreeView treeview;
treeview.setModel(&model);
treeview.setRootIndex(model.index(QDir::currentPath()));
treeview.show();
QObject::connect(&treeview, &QTreeView::pressed, [&](const QModelIndex &
index) {
qDebug() << model.fileName(index);
});
return app.exec();
}
简单的一段代码,lamda表达式的&换成=,通过传值的方式为啥无法访问model?传递引用则可以捕获这个外部变量?
--
FROM 101.20.43.*
试了一下通过传递指针的方式是可以的。
但还是不明白为何通过传值的方式无法传递model对象。
【 在 passbyer (扯淡王) 的大作中提到: 】
: #include <QApplication>
: #include <QFileSystemModel>
: #include <QTreeView>
: ...................
--
FROM 101.20.43.*
通常 Qt 的这些对象都是禁止值拷贝的。你可以看文档,Qt 的 GUI 类通常都没有复制构造函数,或者继承于 QObject 的类型都没有复制构造函数。
考虑一下复制一个窗口是什么含义?变成两个一模一样的窗口?复制一个 DirModel 通常也是不正确的需求。
实际上,无论你用 = 还是 & 都是错误的方式。尤其是 &,经常会引发野指针访问崩溃。建议你养成好习惯,这样子:
QFileSystemModel model;
QPointer<QFileSystemModel> ptr_model(&model);
QObject::connect(...., [ptr_model] {
if (ptr_model.isNull())
return;
ptr_model->reset();
});
使用 QPointer<> 或者 QSharedPointer<> 才是正确的 lambda 编程风格。
【 在 passbyer (扯淡王) 的大作中提到: 】
: 试了一下通过传递指针的方式是可以的。
: 但还是不明白为何通过传值的方式无法传递model对象。
--
FROM 183.253.23.*
"尤其是 &,经常会引发野指针访问崩溃"
这句话怎么理解呢?
【 在 hgoldfish (老鱼) 的大作中提到: 】
: 通常 Qt 的这些对象都是禁止值拷贝的。你可以看文档,Qt 的 GUI 类通常都没有复制构造函数,或者继承于 QObject 的类型都没有复制构造函数。
: 考虑一下复制一个窗口是什么含义?变成两个一模一样的窗口?复制一个 DirModel 通常也是不正确的需求。
: 实际上,无论你用 = 还是 & 都是错误的方式。尤其是 &,经常会引发野指针访问崩溃。建议你养成好习惯,这样子:
: ...................
--
FROM 111.196.8.40
你这段代码没有这个问题。不过考虑这样的代码:
class MyMainWindow: public QMainWindow {
public:
MyMainWindow()
: ui(new Ui::MyMainWindow()) {
QFileSystemModel model;
connect(ui->button, SIGNAL(clicked()), [&] { model.reset(); });
}
private:
Ui::MyMainWindow *ui;
};
这是会崩溃的代码,因为 model 在栈里面,退出 MyMainWindow 构造函数以后就销毁了。当你点下按钮时,lambda 里面的 model 就是野指针。
我故意把这段代码写错。还有很多情况,比如你传了 lambda 给线程,线程还在运行的时候引用的变量在主线程里面被销毁了。或者其它销毁对象的情况。lambda 都会崩溃。
【 在 Daimon (天行健,君子以自强不息) 的大作中提到: 】
: "尤其是 &,经常会引发野指针访问崩溃"
: 这句话怎么理解呢?
--
FROM 183.253.23.*
非常感谢!
【 在 hgoldfish 的大作中提到: 】
: 通常 Qt 的这些对象都是禁止值拷贝的。你可以看文档,Qt 的 GUI 类通常都没有复制构造函数,或者继承于 QObject 的类型都没有复制构造函数。
: 考虑一下复制一个窗口是什么含义?变成两个一模一样的窗口?复制一个 DirModel 通常也是不正确的需求。
: 实际上,无论你用 = 还是 & 都是错误的方式。尤其是 &,经常会引发野指针访问崩溃。建议你养成好习惯,这样子:
: ...................
--
FROM 119.57.116.*