0

テンプレートを使用するとプログラムがクラッシュするのはなぜですか? 私が間違っていることは何ですか?実際のプログラムはここに掲載するには大きすぎるため、これはテスト プログラムです。最初のqDebugwithtest1は表示されますが、2 番目は表示されません。

#include <QCoreApplication>
#include <QDebug>
#include <QMutex>

class MutexLocker {
public:
    MutexLocker(QMutex& m) : _m(m) { _m.lock(); }
    ~MutexLocker() { _m.unlock(); }

private:
    QMutex& _m;
};

template<typename T>
class ThreadGuard {
public:
    ThreadGuard() { _mutex = new QMutex(); }

    ~ThreadGuard() { delete _mutex; }

    void set(const T& other) {
        MutexLocker m(*_mutex); Q_UNUSED(m);
        _r = other;
    }

    void set(int i, int j) {
        MutexLocker m(*_mutex); Q_UNUSED(m);
        _r[i] = j;
    }

    T r() const {
        MutexLocker m(*_mutex); Q_UNUSED(m);
        return _r;
    }

    const ThreadGuard<T>& operator=(const T& other) {
        set(other);
        return *this;
    }

private:
    ThreadGuard(const ThreadGuard&) {}

    T _r;
    QMutex *_mutex;
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QVector<int> test1(10);

    for(int i = 0; i < 10; i++){
        test1[i] = i*2;
    }
    for(int i = 0; i < 10; i++){
        qDebug() << test1[i];
    }

    ThreadGuard<QVector<int> > test2;
    test2.r().resize(10);

    for(int i = 0; i < 10; i++){
        test2.r()[i] = i*2;
    }
    for(int i = 0; i < 10; i++){
        qDebug() << test2.r()[i];
    }


    return a.exec();
}

MS Vista で Qt 5.4 を使用しています。

前もって感謝します!

4

1 に答える 1

2

このメソッドを追加します。

T & r() {
    MutexLocker m(*_mutex); Q_UNUSED(m);
    return _r;
}

説明:

T r() constのコピーを返しますr_。それはその後破壊されます。実際r_はここでは変更されませんtest2.r().resize(10);。そして後で。

于 2015-06-10T13:19:54.447 に答える