0

为什么这不起作用?

类继承自 QObject

b 是班级孩子。

bar是Foo子。

void Class::method(Foo& b) {
    Bar* bar = b.getBar();
    QObject::connect(bar, &Bar::s1, [&]{
        auto x = bar->x(); // this line throw an exception read access violation.
    });
}

作为第一个猜测,我认为调用插槽时该栏不再存在。要纠正它,我需要按价值捕获。

我说对了吗?

使其工作的更改:

void Class::method(Foo& b) {
    Bar* bar = b.getBar();
    QObject::connect(bar, &Bar::s1, [bar]{
        auto x = bar->x(); // this line throw no more exceptions and work as expected.
    });
}
4

1 回答 1

2

bar是局部指针变量。当您通过引用捕获时,它与捕获相同[&bar],即键入它Bar**。之后,您尝试bar在 lambda 中访问,假设指向的指针Bar位于捕获的&bar地址中。这不是真的,因为局部变量被破坏了。类型的实际对象Bar仍然位于相同的地址,但该地址在被捕获时已损坏[&]。因此,将捕获更改为[bar]直接捕获指针是正确的,而不是可以找到该指针的地址。

于 2017-08-12T12:26:08.430 回答