大数组上的分段错误

2024-03-03

以下代码在 2GB 机器上运行时出现分段错误,但在 4GB 机器上运行。

int main()
{
   int c[1000000];
   cout << "done\n";
   return 0;
}

数组的大小仅为 4Mb。 C++ 中可以使用的数组的大小是否有限制?


您可能只是在这里遇到堆栈溢出。该数组太大,无法放入程序的堆栈区域;对于大多数主流桌面/服务器操作系统上的用户空间代码,堆栈增长限制通常为 8 MiB 或 1 MiB。 (普通的C++实现使用asm堆栈进行自动存储,即非static局部变量数组。这使得当函数返回或异常通过它们传播时,它们会免费释放。)

如果你动态分配数组,你应该没问题,假设你的机器有足够的内存。

int* array = new int[1000000];    // may throw std::bad_alloc

但请记住,这将要求您delete[]手动数组以避免内存泄漏,即使您的函数通过异常退出。在现代 C++ 中强烈建议不要手动 new/deleteRAII https://en.cppreference.com/w/cpp/language/raii.


更好的解决方案是使用std::vector<int> array (参考参数 https://en.cppreference.com/w/cpp/container/vector)。如果您知道它会增长到多大,您可以为 1000000 个元素保留空间。甚至resize它默认构造它们(即对内存进行零初始化,这与声明没有初始化程序的普通 C 样式数组不同),例如std::vector<int> array(1000000)

当。。。的时候std::vector对象超出范围,它的析构函数将为您取消分配存储,即使这是通过父函数捕获的子函数中的异常发生的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

大数组上的分段错误 的相关文章

随机推荐

  • Java 中 ByteBuffer 部分的原子读取和写入

    我有一个字节缓冲区 http docs oracle com javase 6 docs api java nio ByteBuffer html在java中 并且想要读取 然后有条件地修改该字节 例如使用如下方法 public void
  • intel core i7 处理器使用哪种缓存映射技术?

    我了解了不同的缓存映射技术 例如直接映射和完全关联或集关联映射 以及这些技术之间的权衡 维基百科 https en wikipedia org wiki Cache placement policies 但我很好奇现在Intel core
  • 在android ndk项目中添加libpng

    我搜索了很多有关将 libpng 链接到我的 android ndk 项目的主题 但我找到了解决我的问题的正确答案 我希望有人能帮助我 这是我的项目的层次结构 jni different cpp files different hpp fi
  • 在 Keras 和 Tensorflow 中复制模型以实现多线程设置

    我正在尝试在 Keras 和 TensorFlow 中实现 actor critic 的异步版本 我使用 Keras 作为构建网络层的前端 我直接使用张量流更新参数 我有一个global model和一个主要的张量流会话 但在每个线程内我正
  • 按字符串对 std::vector> 进行排序?

    我该如何排序vector通过比较pair first这是一个std string 不提供静态比较函数 也不使用boost std vector
  • 日历事件查询选择

    我尝试读出特定日历中的事件 以下是我尝试使用的代码 但我不知道选择是什么样子 我想使用日历 ID 进行选择 如果没有选择 空 它会读出所有日历 但我只想要一个 查询如下所示 public final Cursor query Uri uri
  • 文本对齐:右对齐;仅用于占位符?

    怎样才能活跃text align right 仅用于占位符
  • 从 JPQL 查询返回 JPA 实体的子集作为映射数组?

    在 JPQL 中 可以使用构造函数表达式来请求实体的子集 例如 SELECT NEW example EmployeeDetails e name e salary e department name FROM Employee e 它返回
  • GetTickCount() 实际测量什么?

    我想知道 Windows API 是做什么的GetTickCount http msdn microsoft com en us library windows desktop ms724408 28v vs 85 29 aspx实际测量
  • 嵌套多线程操作跟踪

    我有一个类似的代码 void ExecuteTraced Action a string message TraceOpStart message a TraceOpEnd message 回调 a 可以再次调用 ExecuteTraced
  • Google Sceneform – 它已被弃用吗?有替代品吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我在我的 ARCore 项目 Sceneform 中使用 看来这个项目现在被称为Archived htt
  • 洗牌向量 - 样本()的所有可能结果?

    我有一个包含五个项目的向量 my vec lt c a b a c d 如果我想将这些值重新排列到一个新的向量中 随机播放 我可以使用sample shuffled vec lt sample my vec 简单 但sample 函数只给我
  • Haskell 中的验证

    我有一些需要验证的嵌套记录 我想知道惯用的 Haskell 方法是什么 简化一下 data Record Record recordItemsA ItemA recordItemB ItemB deriving Show data Item
  • 打开 JSX 文件时如何使 VS Code 将语言更改为 JavaScript React

    目前 当我打开一个 jsx文件的默认语言是纯 JavaScript 有没有办法设置编辑器根据文件扩展名更改语言 理想情况下 我可以将此设置放入本地设置配置文件或工作区特定配置文件中 我使用的版本是Version 1 15 0 insider
  • 更改 API 级别 Android Studio

    我想将 Android Studio 中的最低 SDK 版本从 API 12 更改为 API 14 我尝试在清单文件中更改它 即
  • Eclipse 中的“Android Private Libraries”文件夹是什么?

    我最初以为它是专门用于像支持库这样的官方库的 然而 每当我使用 添加到构建路径 菜单项添加自定义 JAR 时 它都会自动显示在 引用库 和 Android 私有库 中 其中之一是多余的 因为在构建时导出两者是没有意义的 此外 Android
  • 命令不同步,您现在无法运行此命令

    我正在尝试使用 mysqldb 创建一些表 问题是当执行python脚本时db pymysql 抛出错误 mysql exceptions ProgrammingError 2014 命令不同步 您现在无法运行此命令 db py impor
  • 如何使用 Dagger2 将 Activity 范围内的依赖项替换为模拟

    我的 Activity 中有范围依赖项 我想用一些模拟来测试该 Activity 我读过有关建议在测试期间用测试组件替换应用程序组件的不同方法 但我想要的是替换活动组件 例如 我想在 MVP 设置中针对模拟演示者测试活动 我相信通过在 Ac
  • PHP:如何将无穷大或 NaN 数字编码为 JSON?

    显然 无穷大和 NaN 不是 JSON 规范的一部分 因此这个 PHP 代码 numbers array numbers positive infinity INF numbers negative infinity INF numbers
  • 大数组上的分段错误

    以下代码在 2GB 机器上运行时出现分段错误 但在 4GB 机器上运行 int main int c 1000000 cout lt lt done n return 0 数组的大小仅为 4Mb C 中可以使用的数组的大小是否有限制 您可能