テンプレートを使用するとプログラムがクラッシュするのはなぜですか? 私が間違っていることは何ですか?実際のプログラムはここに掲載するには大きすぎるため、これはテスト プログラムです。最初のqDebug
withtest1
は表示されますが、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 を使用しています。
前もって感謝します!