我担心 C++ 程序可能会消耗大量 Not Acceptable 内存。我宁愿让程序将自身限制在堆内存的最大数量,并且在超出这个数量时分配失败,而不是粗暴地吞噬所有可能的 RAM 和交换。理想情况下,我希望将最大堆大小作为程序的命令行参数,类似于 Java 虚拟机的 -Xmx
选项。除了手动对每个小分配进行 Bean 计数之外,是否有任何语言功能可以实现此目的?
最佳答案
静态堆栈和堆大小
要为可执行文件静态设置堆栈和堆大小(即在构建时),您可以根据您的工具链执行以下操作之一。
对于 Visual Studio,可以设置堆栈和堆大小:
- 使用
/STACK:NNN
和/HEAP:MMM
命令行选项,其中NNN
和MMM
是分别是堆栈和堆的大小, - 通过 GUI(项目属性 --> 配置属性 --> 链接器 --> 系统...),或
- 使用 pragma 指令,例如
#pragma comment(linker "/STACK:NNN")
和#pragma comment(linker "/HEAP:MMM")
。
或者,您可以使用 EDITBIN 工具修改现有可执行文件的堆栈和堆大小。
对于gcc,可以设置堆栈和堆大小:
- 使用命令行选项
-Wl,--stack=NNN
和-Wl,--heap=MMM
。
动态堆大小
要动态设置堆大小(即在运行时),您可以:
- 重载 C++ 运算符 new 和 delete(C 中的 malloc 和 free)或
- 在您的平台上使用分配 Hook (例如,用于 MS CRT 的 _CrtSetAllocHook)。
在运算符/钩子(Hook)的实现中,您可以根据需要(例如基于命令行参数)限制堆大小(即无法分配内存)。
关于c++ - C++ 中的自限制堆大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28653477/