QtConcurrent::run() 为成员函数不使用原始实例

QtConcurrent::run() for a member function does not use the original instance

我想对成员函数使用QtConcurrent::run(),但是好像没有使用指向实例的指针。相反,它看起来像是调用了默认构造函数

#include <QObject>
#include <QDebug>
#include <QtConcurrent>

class Foo : public QObject
{
    Q_OBJECT
public:
    Foo(int n = 0):n(n){}
    Foo(const Foo & f):Foo(f.n){}

    void foo(){qDebug() << "Foo " << n;}
    void bar(){QtConcurrent::run(this, &Foo::foo);}

private:
    int n;
};

void test(){
  Foo foo = Foo(2);
  foo.foo();
  foo.bar();
  QtConcurrent::run(&foo, &Foo::foo);
  QtConcurrent::run(&foo, &Foo::bar);
}

运行 test() 的结果是:

Foo  2
Foo  0 // Should be a 2
Foo  0 // Should be a 2
Foo  0 // Should be a 2

编辑:我的实例确实超出了范围。此代码工作正常

void test(){
    Foo * foo = new Foo(2);
    foo->foo();
    foo->bar();
    QtConcurrent::run(foo, &Foo::foo);
    QtConcurrent::run(foo, &Foo::bar);
}

调用已被破坏的对象是未定义的行为。发生的事情是当 QtConcurrent::run 有效执行 Foo::bar 时,参数 foo 已被破坏。

如果我尝试复制您的代码,我有:

Foo  2 
Foo  1730312062 
Foo  1730312062 

问题来自于对象 foo 在堆栈上,一旦 test return 就会失效。 为您的对象提供更长的使用寿命。