RMS计算过程中出现分段故障



我有以下代码:

float am::getMA()
{
double cVA = 0;
double pS = 0;
double avg = 0;
const qint16 *ampliData = audioGather().constData<qint16>();
double sampleCount = audioGather().sampleCount();
for (int i=0; i<sampleCount; i++){
avg = ampliData[i]/peak;
pS += avg * avg;
count++;
}
cVA = sqrt(pS / (sampleCount/2));
return cVA;
}

此操作每1秒运行一次,并使用该值更新标签。对于运行时的前5秒左右(因此,函数的五次调用(,这很好。但在那之后,该应用程序在avg = ampliData[i]/peak;行发生segfault而崩溃

调试器没有提供任何有用的信息,断点处的所有变量值似乎都很好。

这里是audioGather():

QAudioBuffer am::audioGather()
{
QAudioFormat format;
format.setSampleRate(40000);
format.setChannelCount(1);
format.setSampleFormat(QAudioFormat::Int16);
QByteArray sA = UC::getSigned16();
QAudioBuffer ampliBuffer(sA, format, -1);
return ampliBuffer;
}

此外,UC::getSigned16()只是从另一个函数中获取一个值,该函数在加载新的值之前不会清除以前的值,因此不应该(也没有(存在它为空的条件。

给定您提供的代码片段,以下是一些潜在的罪魁祸首:

  • amplData可能没有您想象的那么大(即小于sampleCount(。如果是这种情况,那么如果i>而不是amplData的实际大小。

  • 峰值未在函数中定义,可能为零。您提到,在该代码中设置断点表明所有变量都是有效的,所以这可能不是问题所在。

我的直觉说问题出在ampliftData指向的数组的大小上。您可以尝试设置断点,然后查看ampliftData指向的内存。

最新更新