堆栈溢出Visual C++,可能的数组大小?

堆栈溢出Visual C++,可能的数组大小?,c++,arrays,stack,overflow,C++,Arrays,Stack,Overflow,据我所知,这不是由无限递归引起的 该程序功能正常,阵列较小,是一个音频编辑器。现在,我增加了功能,允许更大的阵列提供高达5分钟的音频,264600条16位数据~50mb 由于增加了数组的大小,我在一个特定函数上收到了堆栈溢出错误,它应该通过将数组向后写入新数组,然后覆盖原始数组来反转输入文件的播放。我猜每个阵列可能高达50MB,这可能是问题所在: //initialise temporary new array to place samples in short signed int rever

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

该程序功能正常,阵列较小,是一个音频编辑器。现在,我增加了功能,允许更大的阵列提供高达5分钟的音频,264600条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++是相当新的,一般来说是编程,我不确定调试过程中我所得到的错误是什么。
任何帮助都将不胜感激,我相信有一个足够简单的解决方案,我已经阅读了有关“堆”的内容,但我不确定“堆”到底是什么。

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

更好的是,您应该避免手动分配,并使用std::vector,它将处理内存分配本身。作为奖励,您不需要关心解除分配。这就是现代C++方式。 顺便说一句,如果max_number_samples很大,您可能应该只分配您需要的数量:

std::vector<short int> reverse_data(track_samples);
作为Vlad,不要在堆栈上分配50MB

但是,这一点毫无意义,因为您不需要分配任何数据。尝试用对以下对象的单个调用替换整个代码片段:


后记:不要忘记包含。

+1…并且不要对如此大量的数据使用递归!啊,谢谢,所以问题在于阵列的大小,正如我所预料的那样!如何在堆上而不是堆栈上初始化数组?Re:只分配所需数量:如果最大数量样本大于跟踪样本,则反转样本数据[max\u number\u samples-1-I]当i==0时会崩溃。更好的想法:@Rob:我想这是OP代码中的一个错误:他想要的是跟踪样本而不是最大数量的样本。你确定反向数据[max\u number\u samples-1-i]正确吗?您只在reverse_数据数组的末尾写入数据,但从一开始就读取了数据。啊,我没有看到这个注释。你是对的,但是我使用了另一个循环来搜索音频的开头,并且只将数据从音频的开头写到结尾。非常感谢你的帮助!
for (i=0; i < track_samples/2; i++)
{
    std::swap(sound_data[i], sound_data[track_samples-1-i]);
}
std::reverse(&sound_data[0], &sound_data[track_samples]);