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

标签 c++ qt memory-corruption

我在通过给定方法引用传递数据时遇到问题 - 当该方法访问数据时,它已损坏,但我确定调用该方法时它没有(通过调试)。这是类似代码的内容:

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

相关文章:

Java volatile变量影响其他非volatile变量的内存一致性

c++ - 来自无关库对象的静态变量损坏(反之亦然)

c++ - 输出吐出两个额外的控制字符,可能是内存损坏错误?

c++ - 2010 版 MFC 代码在 2013 年不再工作,有什么建议吗?

c++ - 如何找出为什么我的程序一直有无限循环?

c++ - 具有来自类层次结构的参数的多态函数

qt - 仅在形状内部按下时才移动 QGraphicsItem。否则,拖动场景

C++ 对模板成员函数的 undefined reference

c++ - 加速 3 维数组上的许多访问

Qt之类的C框架?