堆栈溢出可视化C ++,可能是数组大小?

时间:2012-05-10 14:44:02

标签: c++ arrays stack overflow

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

程序使用较小的数组(它是一个音频编辑器)正常运行。现在我增加了功能以允许更大的阵列(最多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 ++和编程很新,并且不确定我在调试过程中遇到的错误确实告诉了我。

任何帮助都会受到赞赏,我确信这里有一个简单的解决方案(我读过涉及'堆'的东西,但我对'堆'确实是什么并不自信)。

2 个答案:

答案 0 :(得分:6)

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

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

顺便说一句,如果max_number_samples很大,你应该只根据需要分配:

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

(其余代码保持原样)。

编辑:
更好的想法:你可以在适当的位置反转你的阵列,而无需复制到另一个阵列!只需从索引0转到半尺寸并交换i(size - 1 - i)项:

for (i=0; i < track_samples/2; i++)
{
    std::swap(sound_data[i], sound_data[track_samples-1-i]);
}

答案 1 :(得分:3)

作为Vlad pointed out,不要在堆栈上分配50MB。

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

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

<小时/> Postscript :不要忘记#include <algorithm>