我在通过给定方法引用传递数据时遇到问题 - 当该方法访问数据时,它已损坏,但我确定调用该方法时它没有(通过调试)。这是类似代码的内容:
//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
附加信息:
- array 是 Qt 的 QByteArray
- readerPos 是一个 int,它从应该读取的点数据开始迭代 QByteArray
- constData() 返回一个 const char*
谢谢,
莫吉尔
最佳答案
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);
关于c++ - 将数据传递给方法时内存损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23665041/