2014-05-14 37 views
0

我在通過引用給定方法傳遞數據時遇到問題 - 當方法訪問數據時,數據已損壞,但我確信當方法被調用時它不是(通過調試)。下面是類似的代碼:將數據傳遞給方法時內存損壞

//Calling code 
const void* tempPointer = array.mid(readerPos,RE8K_ICDEF_HARMONICS_SIZE).constData(); 
const re8k_ics_harmonics* const newStruct = static_cast< const re8k_ics_harmonics* >(tempPointer); 

DSInstance().updateHarmonics(*newStruct); 

//method 
void DataStream::updateHarmonics(const re8k_ics_harmonics &infoHarmonics, ...) 
{ 
    //Use infoHarmonics 
} 

所以,如果我使用調試器,去把一個斷點在「調用代碼」中的最後一行,看什麼是newStruct,我看到的數據是它應該是完美的。比方法被調用,我把一個新的斷點(或去「下一行」),直到輸入第一行updateHarmonics裏面,當我看到infoHarmonics的內容時,我看到部分數據已損壞,部分它在那裏。

爲什麼代碼被破壞?我該怎麼辦? :X

附加信息:

  • 陣列是Qt的QByteArray中
  • readerPos的是,從點數據遍歷所述的QByteArray應讀
  • constData()一個int返回一個const char *

感謝,

Momergil

回答

3
QByteArray QByteArray::mid (int pos, int len = -1) const 

該函數通過值返回對象,所以在線路

const void* tempPointer = array.mid(readerPos, 
           RE8K_ICDEF_HARMONICS_SIZE).constData(); 

你正在服用的指針臨時數據。該指針僅在下一行中無效。你應該在堆上創建對象或者使用堆棧分配的實例,例如:

QByteArray midQ = array.mid(readerPos, RE8K_ICDEF_HARMONICS_SIZE); 
const void* tempPointer = midQ.constData(); // pointer valid as long 
              // as midQ breaths 
const re8k_ics_harmonics* const newStruct = 
         static_cast< const re8k_ics_harmonics* >(tempPointer); 
DSInstance().updateHarmonics(*newStruct); 
+0

謝謝,解決了我所有的問題:)(不能相信我錯過了,但!) – Momergil