自身模板崩溃原因
Crash cause of own template
为什么我的程序在使用我的模板时崩溃了?我做错了什么?
这是一个测试程序,因为实际程序太大而无法发布
这里。
第一个 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。
提前致谢!
添加此方法:
T & r() {
MutexLocker m(*_mutex); Q_UNUSED(m);
return _r;
}
解释:
T r() const
returns r_
的副本。然后被摧毁。而实际的 r_
并没有在这里修改 test2.r().resize(10);
。稍后。
为什么我的程序在使用我的模板时崩溃了?我做错了什么?
这是一个测试程序,因为实际程序太大而无法发布
这里。
第一个 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。
提前致谢!
添加此方法:
T & r() {
MutexLocker m(*_mutex); Q_UNUSED(m);
return _r;
}
解释:
T r() const
returns r_
的副本。然后被摧毁。而实际的 r_
并没有在这里修改 test2.r().resize(10);
。稍后。