2015-06-10 5 views
0

Почему моя программа рушится, когда я использую свой шаблон? Что я делаю неправильно? Это тестовая программа, потому что реальная программа слишком велика для размещения здесь. Отображаются первые 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(); 
} 

Я использую Qt 5.4 на MS Vista.

Заранее благодарен!

+0

test2.r() возвращает копию – willll

+0

Почему вы используете самозаверяемый MutexLocker, а не предоставленный QMutexLocker? –

ответ

2

Добавить этот метод:

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

Объяснение:

возвращает копию r_. Тогда это разрушено. Фактически r_ здесь не изменяется test2.r().resize(10);. И позже.

+0

Спасибо. Это решает проблему. –

 Смежные вопросы

  • Нет связанных вопросов^_^