2013-04-02 41 views
1

我有一個C++ Qt靜態庫,有兩個類 - dataprocthreadcalcvalue。在第一個中,當我調用計算值的一個實例的方法時,指針this(其引用dataprocthread類)突然變爲null「這個」指針變爲空C++

這是dataprocthread.h

class DataProcThread : public QThread 
{ 
    Q_OBJECT 

    public: 
     DataProcThread(int sarray[9], int val); 

    signals: 
     workDone(int result); 

    private:    
     int _sarray[9]; 
     int _val; 
     void run(); 
}; 

dataprocthread.cpp

DataProcThread::DataProcThread(int sarray[9], int val) 
{ 
    for (int x = 0; x < 9; x++) 
    { 
     _sarray[x] = sarray[x]; 
    } 
    _val = val; 
} 

void DataProcThread::run() 
{ 
    CalcValue* cv = new CalcValue(); 
    int myval = 0; 
    for (int i = 0; i < 100; i++) 
    { 
     myval = cv->processData(this->_val); 
     if (this->_sarray[0] != myval) 
     { 
      //do something 
     } 
    } 
    emit workDone(intValue); 
} 

calcvalue.h

class CalcValue 
{ 
    public: 
     CalcValue(); 
     int processData(int someval); 
}; 

calcvalue.cpp

CalcValue::CalcValue() 
{ 
} 

int processData(int someval) 
{ 
    //do something and return int value 
} 

當我運行這段代碼,它突然臨危信號 「段錯誤」。使用調試器,我發現DataProcThread::run()函數中的問題:當我調用cv->processData函數時,一切正常。但在下一行(if (this->_sarray[0] != myval)),this指針變爲null(我可以在本地窗口中看到它),因此,我無法訪問this->_sarray變量。

在情況下,它是很重要的,這就是我如何啓動線程(從另一個類我的圖書館外):

DataProcThread* thread = new DataProcThread(sarray, val); 
QObject::connect(thread, SIGNAL(workDone(int)), this, SLOT(collectWork(int))); 
thread->start(); 

我做錯了嗎?

+0

我猜'this - > _ sarray [0]'爲空。 –

+0

在'this'變爲'null'之前,我可以在Locals窗口中看到'sarray'值。 – ahawkthomas

+3

也許你的processData正在寫內存 – marcinj

回答

2

正如在評論中指出的,問題發生在processData函數中:它正在寫內存。

我只是用strncpy代替strcpy匆匆問題(here是關於一個很好的解釋)。

+1

我希望你知道'strncpy'有它自己的陷阱。 – jamesdlin

+0

是的,但它適合我的任務。 – ahawkthomas

+2

std :: vector &和這樣可以避免使用那些危險的C函數,而std :: unique_ptr或QScopedPointer也會避免使用原始指針。 – paulm