我想使用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 :(得分:3)
调用已被破坏的对象是未定义的行为。发生的事情是QtConcurrent::run
有效执行Foo::bar
时,参数foo
已被破坏。
如果我尝试复制您的代码,我有:
Foo 2
Foo 1730312062
Foo 1730312062
问题来自于对象foo
在堆栈上并且只要test
返回就会无效。 为您的对象提供更长的使用寿命。