-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実際に execute を実行するFoo::barと、パラメーターfooが破壊されているということです。

あなたのコードを複製しようとすると、次のようになります。

Foo  2 
Foo  1730312062 
Foo  1730312062 

foo問題は、オブジェクトがスタック上にあり、返されるとすぐに無効になるという事実から生じますtestオブジェクトの寿命を延ばします。

于 2015-09-23T09:25:49.547 に答える