自身模板崩溃原因

Crash cause of own template

为什么我的程序在使用我的模板时崩溃了?我做错了什么? 这是一个测试程序,因为实际程序太大而无法发布 这里。 第一个 qDebugtest1 显示,但第二个不显示。

#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。

提前致谢!

添加此方法:

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

解释:

T r() const returns r_ 的副本。然后被摧毁。而实际的 r_ 并没有在这里修改 test2.r().resize(10);。稍后。