2015-09-23 20 views
-1

我想为成员函数使用QtConcurrent::run(),但似乎它不使用指向实例的指针。取而代之的是,它看起来像默认的构造函数被调用成员函数的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); 
} 
+0

btw为什么'QObject'的'foo'子类? – UmNyobe

+0

'qDebug()'不是线程安全的。你不能从不同的线程使用它。 –

+0

@UmNyobe,因为我的课在我的真正问题继承自QObject – Fezvez

回答

3

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

如果我试图复制你的代码,我有:

Foo 2 
Foo 1730312062 
Foo 1730312062 

问题来自于一个事实,即对象foo是在栈上,将是无效的,因为一旦test回报。 为您的物体提供更长的使用寿命。

相关问题