堆栈溢出视觉C ++,可能数组的大小?(Stack overflow visual C++, pot

2019-06-24 07:45发布

据我所知,这是不是无限循环引起的。

该方案与较小的阵列(它是音频编辑器)正确地发挥作用。 我现在已经增加的功能性,以允许更大的阵列(最多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 ++和编程,和我不确定什么调试过程中出现了错误真的告诉我。

任何帮助,将不胜感激,我敢肯定有一个很简单的解决办法(我读过的东西,涉及“堆”,但我不相信什么a'heap”确实是)。

Answer 1:

由于弗拉德指出 ,不要在栈上分配50MB。

但是,问题是没有实际意义,因为你不需要分配任何数据。 尝试用一个单一的通话更换整个代码片段std::reverse

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


后记 :不要忘了#include <algorithm>



Answer 2:

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

更妙的是,你应该避免手动分配和使用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]);
}


文章来源: Stack overflow visual C++, potentially array size?