为什么我的程序在使用模板时崩溃了?我做错了什么?
这是一个测试程序,因为实际程序太大而无法发布
这里。
显示第一个qDebug
test1
但第二个不显示。
#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。
提前致谢!
答案 0 :(得分:2)
添加此方法:
T & r() {
MutexLocker m(*_mutex); Q_UNUSED(m);
return _r;
}
说明:
T r() const
会返回r_
的副本。哪个被摧毁了。虽然此处r_
未修改实际test2.r().resize(10);
。后来。