0

据我所知,这不是由无限递归引起的。

该程序可以在较小的数组中正常运行(它是一个音频编辑器)。现在我增加了功能以允许更大的阵列(最多 5 分钟的音频,26460000 条 16 位数据 ~50mb)。

由于增加了数组的大小,我在一个特定函数上收到堆栈溢出错误,它应该通过将数组向后写入新数组来反转输入文件的播放,然后覆盖原始数组。我猜每个数组可能高达 50MB,这可能是问题所在:

//initialise temporary new array to place samples in
short signed int reverse_data[max_number_samples];  

for (i=0; i<track_samples; i++)
{  //puts data from sound_data into reverse_data backwards.
  reverse_data[(max_number_samples-1)-i]=sound_data[i];    
}

for (i=0; i<track_samples; i++)    
{     //now overwrites sound_data with the data in reverse_data
  sound_data[i]=reverse_data[i];
}

我对 C++ 和一般编程相当陌生,并且不确定我在调试期间遇到的错误真正告诉我什么。

任何帮助将不胜感激,我确信有一个足够简单的解决方案(我已经阅读了涉及“堆”的内容,但我不确定“堆”到底是什么)。

4

2 回答 2

6

您不应该在堆栈上分配大型数据结构,因为堆栈的大小是有界的。在堆上分配它。

更好的是,您应该避免手动分配和使用std::vector,这将关心内存分配本身。作为奖励,您无需关心解除分配。(这是现代 C++ 方式。)

顺便说一句,如果max_number_samples很大,您可能应该只分配您需要的数量:

std::vector<short int> reverse_data(track_samples);

(您的其余代码保持原样)。

编辑:
更好的主意:您可以将数组反转到位,而无需复制到其他数组中!只需从索引 0 到一半大小并交换ith 和(size - 1 - i)th 项目:

for (i=0; i < track_samples/2; i++)
{
    std::swap(sound_data[i], sound_data[track_samples-1-i]);
}
于 2012-05-10T14:45:42.567 回答
3

正如 Vlad指出的那样,不要在堆栈上分配 50MB。

但是,这一点没有实际意义,因为您不需要分配任何数据。尝试用一次调用替换整个代码片段std::reverse

std::reverse(&sound_data[0], &sound_data[track_samples]);


后记:别忘了#include <algorithm>

于 2012-05-10T14:59:54.497 回答