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

时间:2015-09-23 07:55:00

标签: qt qtconcurrent

我想使用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);
}

1 个答案:

答案 0 :(得分:3)

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

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

Foo  2 
Foo  1730312062 
Foo  1730312062 

问题来自于对象foo在堆栈上并且只要test返回就会无效。 为您的对象提供更长的使用寿命。