2014-05-14 11 views
0

주어진 메서드에 대한 참조로 데이터를 전달하는 데 문제가 있습니다. 메서드가 데이터에 액세스 할 때 데이터가 손상 될 수 있지만 메서드가 호출 될 때 (디버그에 의해)). 그래서 디버거를 사용하고 마지막 줄에 "전화 코드"에 중단 점을 넣어 가서 newStruct에, 나는 데이터가 볼 무엇을 보면,데이터를 메서드에 전달할 때 메모리 손상

//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 
} 

다음은 코드 같은입니다 그것이 있어야대로 완벽. 메서드가 호출되고 내부의 첫 번째 줄을 입력 할 때까지 새로운 중단 점 (또는 "다음 줄"로 이동)을 넣습니다. infoHarmonics의 내용을 볼 때 데이터의 일부와 부분이 손상된 것으로 나타납니다. 저기있어.

왜 코드가 손상 되었습니까? 어떻게해야합니까? : X

추가 정보 :

  • 배열
  • readerPos는 점 데이터로부터 QByteArray을 반복은
  • constData()을 읽어해야 INT 인 Qt의 QByteArray이다가 CONST 문자를 반환 *

감사합니다,

Momergil

임시 데이터에 대한 포인터를 복용 라인

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

에 있도록

답변

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

이 기능은 값으로 개체를 반환합니다. 이 포인터는 다음 행에서 유효하지 않습니다. 힙에 객체를 만들거나 스택 할당 된 인스턴스를 사용해야합니다. 예 :

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