Повреждение памяти при передаче данных в метод

У меня возникают проблемы при передаче данных по ссылке на определенный метод — когда метод обращается к данным, он поврежден, но я уверен, что при вызове метода это не так (по debuggin). Вот что-то вроде кода:

//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, Я вижу, что часть данных повреждена, а часть есть.

Почему код становится поврежденным? Что я должен делать? :Икс

Дополнительная информация:

  • массив является QByteArray Qt
  • readerPos — это int, который перебирает QByteArray с точки, данные которой должны быть прочитаны
  • constData () возвращает const char *

Спасибо,

Momergil

0

Решение

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);
3

Другие решения


По вопросам рекламы [email protected]