-1

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

1 回答 1

3

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

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

Foo  2 
Foo  1730312062 
Foo  1730312062 

问题来自对象foo在堆栈上并且一旦test返回就会无效的事实。为您的对象提供更长的生命周期。

于 2015-09-23T09:25:49.547 回答