将数据传递给方法时内存损坏

时间:2014-05-14 21:01:08

标签: c++ qt memory-corruption

我在通过引用给定方法传递数据时遇到问题 - 当方法访问数据时,它已损坏,但我确信在调用方法时它不是(通过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 的内容时,我看到部分数据已损坏,部分数据存在。

为什么代码被破坏了?我该怎么办? :X

其他信息:

  • 数组是Qt的QByteArray
  • readerPos是一个int,它从点数据上读取QByteArray应该被读取
  • constData()返回一个const char *

谢谢,

Momergil

1 个答案:

答案 0 :(得分: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);