处理大型C阵列时内存问题

时间:2014-11-26 03:24:56

标签: c++ arrays audio memory segmentation-fault

编辑:原来我不需要乘以FRAMESIZE。框架来自libsndfile API(我忽略了),语义与我的程序中框架的定义不同。因此,大小帧* 2和单声道大小帧。

我接受了下面的答案并不完全正确,但却把我推向了正确的方向。谢谢jxh。


我正在做一些音频工作,用C ++写一个效果。我有一个输入源,它是一个交错的2通道样本数组。我发现将该立体声阵列转换为单声道阵列(getMono())的功能只会导致一次大量内存膨胀(之前为12.7MB,之后为3.69GB)。它也非常慢。在我的测试用例中,立体声阵列的大小为800254.

我对C ++比较陌生。我在大学里做了很多嵌入式C,但没有这样的。所以,这可能是一个初学者错误。

我已将代码修剪为理解和重现错误所需的最少量代码。本质上,setInput在Sukothai构造函数中调用,然后生成输入数组的单声道版本。

#define SAMPLE float    
#define RANDOMWIN .5
#define FRAMESIZE 512


void Sukothai::getMono(SAMPLE * stereo, SAMPLE * mono, int monoSize){
  for (int j = 0; j < monoSize; j++) {
    mono[j] = .7071*(stereo[j*2] + stereo[j*2+1]);
  }
}

void Sukothai::setInput(SAMPLE * in, int frames) {
  // per-iteration additional time in terms of seconds
  //float extraTime = RANDOMWIN*2;

  // new buffer size in terms of samples
  //int newSize = ((int)(maxIter*extraTime*2*THE_SRATE)+frames*FRAMESIZE*2);

  //SAMPLE * current_buffer = new SAMPLE[newSize];

  SAMPLE * mono;
  int currentMonoSize = 0;

  currentMonoSize = frames*FRAMESIZE;
  mono = new SAMPLE[currentMonoSize];
  getMono(in, mono, currentMonoSize);
}

现在,这里有三行被注释掉了。这些行创建变量extraTimenewSizecurrent_buffer。这些都是我效果不同部分的一部分。我在这里评论它们表明它们与立体声到单声道功能没有关系,但是如果我在我的代码中对它们进行评论,我就会出现分段错误。

有谁知道这里发生了什么?

编辑添加了FRAMESIZE定义

1 个答案:

答案 0 :(得分:0)

您在输入数组frames中只有in个元素,并且您将currentMonoSize计算为该数量的512倍。然后,在getMono()中,您继续从in(不称为stereo)读取currentMonoSize的两倍。这意味着您阅读的内容远远超出您指定的in中的元素数量。

逻辑上,mono数组的元素应该是stereo输入的一半。