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 就会失效。 为您的对象提供更长的使用寿命。
我想对成员函数使用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 就会失效。 为您的对象提供更长的使用寿命。