gpt4 book ai didi

c - 如何在 Linux 中限制 C 代码的堆大小

转载 作者:太空狗 更新时间:2023-10-29 11:08:32 26 4
gpt4 key购买 nike

我想知道是否可以限制在 linux 机器上执行的 C 代码分配的堆大小。

有可能吗?

这样做的目的是除了其他全局变量和局部变量之外,我动态分配了 ~70KBytes 内存和~20KBytes 堆栈内存。动态分配是通过 malloc() 完成的。

因此,为了确认问题不在于堆分配,我想限制将要运行的 C 代码的堆内存。

我在网上看了一些文章,发现如果我们使用malloc(),内存可能会被过度使用,但是如果我们使用calloc(),我们只会得到可用的内存而不会被过度使用,因为calloc()必须初始化在给出指针之前将内存块清零。但由于初始化开销,我不想使用 calloc()。

最佳答案

你可以使用(在你的程序中)setrlimit(2) ,可能与 RLIMIT_AS(由 Ouah's answer 引用)。

更好的是,让您的 shell 执行此操作。对于 bash,它是内置的 ulimit

确保您的程序确实正确且完整地处理了所有地方的 malloc 失败(测试 malloc 的每个返回值是否与 NULL 指示其失败) .

如果你不测试 malloc 的结果,当它失败时,它会给出 NULL 并且下一条指令很可能会取消引用空指针(或一些非常接近它的地址),即 undefined behavior在 Linux 上给出 segmentation violation .

您可能应该考虑使用 valgrind在调试阶段。

顺便说一句,70KB 的内存在今天已经很小了(至少在 Linux 笔记本电脑、台式机甚至平板电脑上是这样)。请注意 C standard library可以在幕后调用 malloc(例如,fopen 给出一个 FILE 句柄,它有一些缓冲区,可以通过 在内部获得>malloc)

memory overcommit可以使用以下命令在 Linux 上禁用

echo 0 > /proc/sys/vm/overcommit_memory

以root身份运行。

关于c - 如何在 Linux 中限制 C 代码的堆大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29515944/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com