【问题标题】:Stack overflow visual C++, potentially array size?堆栈溢出视觉 C++,可能是数组大小?
【发布时间】:2023-03-10 13:58:01
【问题描述】:

据我所知,这不是无限递归造成的。

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

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

【问题讨论】:

  • 你确定reverse_data[(max_number_samples-1)-i] 是正确的吗?您仅将数据写入 reverse_data 数组的末尾部分,而不是从头开始读取它们。
  • 啊,我没看到这条评论。你是对的,但后来我使用了另一个循环来搜索音频的开头,并且只将数据从音频的开头写入到结尾。非常感谢您的帮助!

标签: c++ arrays stack overflow


【解决方案1】:

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

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

【讨论】:

  • +1 ...并且不要对如此大量的数据使用递归!
  • 啊,谢谢,所以问题在于数组的大小,正如我所料!我将如何在堆而不是堆栈上初始化我的数组?
  • Re: "只分配你需要的量": 如果max_number_samples 大于track_samples,那么reverse_data[(max_number_samples-1)-i] 将在i==0 时崩溃。
  • @Rob:我认为这是 OP 代码中的一个错误:他实际上想要的是 track_samples 而不是 max_number_samples
【解决方案2】:

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

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

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


后记:别忘了#include &lt;algorithm&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 2013-11-15
    • 1970-01-01
    • 2018-07-24
    • 2012-05-21
    • 2013-07-11
    • 2021-03-17
    相关资源
    最近更新 更多