c++ - C++ 中的自限制堆大小

标签 c++ memory-management heap-memory

我担心 C++ 程序可能会消耗大量 Not Acceptable 内存。我宁愿让程序将自身限制在堆内存的最大数量,并且在超出这个数量时分配失败,而不是粗暴地吞噬所有可能的 RAM 和交换。理想情况下,我希望将最大堆大小作为程序的命令行参数,类似于 Java 虚拟机的 -Xmx 选项。除了手动对每个小分配进行 Bean 计数之外,是否有任何语言功能可以实现此目的?

最佳答案

静态堆栈和堆大小

要为可执行文件静态设置堆栈和堆大小(即在构建时),您可以根据您的工具链执行以下操作之一。

对于 Visual Studio,可以设置堆栈和堆大小:

  • 使用 /STACK:NNN/HEAP:MMM 命令行选项,其中 NNNMMM 是分别是堆栈和堆的大小,
  • 通过 GUI(项目属性 --> 配置属性 --> 链接器 --> 系统...),或
  • 使用 pragma 指令,例如#pragma comment(linker "/STACK:NNN")#pragma comment(linker "/HEAP:MMM")

或者,您可以使用 EDITBIN 工具修改现有可执行文件的堆栈和堆大小。

对于gcc,可以设置堆栈和堆大小:

  • 使用命令行选项-Wl,--stack=NNN-Wl,--heap=MMM

动态堆大小

要动态设置堆大小(即在运行时),您可以:

  • 重载 C++ 运算符 newdelete(C 中的 malloc 和 free)或
  • 在您的平台上使用分配 Hook (例如,用于 MS CRT 的 _CrtSetAllocHook)。

在运算符/钩子(Hook)的实现中,您可以根据需要(例如基于命令行参数)限制堆大小(即无法分配内存)。

关于c++ - C++ 中的自限制堆大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28653477/

相关文章:

c++ - 内存分配 - 15 GB 如何等于 2GB?

C编程堆缓冲区溢出

c++ - C++11 中的函数签名差异

c++ - 使用 C++ 接口(interface)的最佳方式

C++ new/new[],它是如何分配内存的?

go - 准确测量堆增长

java - 常量 dspace 错误 java.lang.OutOfMemoryError : Java heap space

c++ - 为什么在此代码中隐式转换为常量迭代器会失败?

c++ - cout 可以更改 char 数组的内容吗?

objective-c - ARC 禁止发送 'retain' 问题的显式消息