【问题标题】:C++ Is there a limitation about size of buffer..? [duplicate]C ++缓冲区大小是否有限制..? [复制]
【发布时间】:2021-12-10 08:39:50
【问题描述】:

我有一个大文件要阅读。当我尝试使用 10mb 的字符缓冲区时,我遇到了堆栈溢出。

const size_t buffsize = 1024 * 1024 * 10; // 10mb
char buff[buffsize];

Exception thrown at 0x00007FF7FF42D3F7 in ConsoleApplicationTest.exe: 0xC00000FD: Stack overflow (parameters: 0x0000000000000001, 0x000000E352D03000).
Unhandled exception at 0x00007FF7FF42D3F7 in ConsoleApplicationTest.exe: 0xC00000FD: Stack overflow (parameters: 0x0000000000000001, 0x000000E352D03000).

在 C# 上,我曾经使用超过 100mb 的缓冲区。所以我也在 c++ 上尝试过,但没有成功。有件事我不知道。请告诉我。谢谢。

【问题讨论】:

  • C# 不是 C++。使用std::vector<char> buff(buffsize); 在编写 C++ 程序时不要使用 C# 作为模型。
  • 如果您需要一个大数组,请在堆上而不是在堆栈上创建它(例如,使用std::vector)。
  • 简而言之:是的,有限制;它是什么取决于您的平台和操作系统。在常见的桌面和服务器平台上,它通常在 1-10 MB 范围内,所以 10 MB 肯定太大了。
  • 还要注意类型:1024 * 1024 * 1024 * 10 不是 10GB。

标签: c++ buffer-overflow


【解决方案1】:

缓冲区大小是否有限制..?

是的。具有无限内存的计算机尚未发明。总是有限制的。

堆栈溢出

根据错误,我们可以猜测您使用了自动存储缓冲区。自动存储中对象的限制通常比系统的总内存要严格得多。它因系统而异,但在服务器和桌面系统上通常默认为 1 到几兆字节,并且通常在同一线程内具有重叠自动存储持续时间的所有对象之间共享。

对大型对象(例如此缓冲区)使用动态或静态存储。一个简单的解决方案是使用std::vector

【讨论】:

    猜你喜欢
    • 2022-11-11
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 2021-02-25
    相关资源
    最近更新 更多