问题标签 [malloc]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
11 回答
7029 浏览

c - 我应该费心在我的 C 代码中检测 OOM(内存不足)错误吗?

我已经将大量的 C 代码行用于清理标签/条件以用于失败的内存分配(由alloc返回的系列表示NULL)。我被告知这是一种很好的做法,因此,在内存故障时,可以标记适当的错误状态,并且调用者可以潜在地执行“优雅的内存清理”并重试。我现在对这种哲学有一些疑问,我希望能澄清一下。

我想调用者可能会释放过多的缓冲区空间或剥离其数据的关系对象,但发现调用者很少有能力(或处于适当的抽象级别)这样做。此外,从被调用函数中提前返回而没有副作用通常很重要。

我还刚刚发现了 Linux OOM 杀手,这似乎使这些努力在我的主要开发平台上毫无意义。

默认情况下,Linux 遵循乐观的内存分配策略。这意味着当 malloc() 返回非 NULL 时,不能保证内存确实可用。这是一个非常糟糕的错误。如果发现系统内存不足,一个或多个进程将被臭名昭著的 OOM 杀手杀死。

我认为可能还有其他平台遵循相同的原则。是否有一些实用的东西使得检查 OOM 条件值得?

0 投票
5 回答
976 浏览

c - 从函数内重新分配

我有一个名为 ball 的结构、多个球、一个球数组和一个我想向数组添加新球的函数:

结构:

非工作功能):

和main中的函数调用:

对该函数的调用失败并显示以下错误消息:

有什么帮助吗?

这有帮助。它现在可以编译,但我在运行时遇到分段错误错误。如果感兴趣,这是完整的代码:

0 投票
7 回答
95668 浏览

c++ - C ++中的“new”和“malloc”和“calloc”有什么区别?

new“ ” 和 “ malloc” 和 “ ” 和家庭中的其他人有什么区别calloc

(什么时候)我需要“ new”以外的东西吗?

其中一个是使用其他实现的吗?

0 投票
9 回答
9575 浏览

c++ - 何时使用 Malloc 而不是 New

重复:在什么情况下我使用malloc vs new?

只是重新阅读这个问题:
C ++中的“new”和“malloc”和“calloc”有什么区别?

我检查了答案,但没有人回答这个问题:

  • 我什么时候会使用 malloc 而不是 new?

有几个原因(我可以想到两个)。
让最好的漂浮到顶部。

0 投票
9 回答
12166 浏览

windows - 64 位大型 malloc

malloc() 失败的原因是什么,尤其是在 64 位中?

我的具体问题是试图在 64 位系统上分配 10GB 的巨大 RAM 块。这台机器有 12GB 的 RAM 和 32GB 的交换空间。是的,malloc 是极端的,但为什么会有问题呢?这是在带有 Intel 和 MSFT 编译器的 Windows XP64 中。malloc 有时会成功,有时不会,大约 50%。8GB malloc 总是有效,20GB malloc 总是失败。如果 malloc 失败,重复请求将不起作用,除非我退出该进程并再次启动一个新进程(然后将有 50% 的成功率)。没有其他大型应用程序正在运行。它甚至在重新启动后立即发生。

如果您用完了可用的 32(或 31)位地址空间,我可以想象 malloc 在 32 位中失败,这样就没有足够大的地址范围来分配给您的请求。

如果你用完了物理 RAM硬盘交换空间,我也可以想象 malloc 会失败。这不是我的情况。

但是为什么 malloc 会失败呢?我想不出其他原因。

我对一般 malloc 问题比我的具体示例更感兴趣,无论如何我可能会用内存映射文件替换它。失败的 malloc() 比其他任何事情都更像是一个谜……渴望了解您的工具而不是对基本原理感到惊讶。

0 投票
8 回答
1522 浏览

c - 为什么我应该在“char bigchar[1u << 31 - 1];”时使用 malloc() 工作得好吗?

与静态数组相比,使用 malloc(除了失败时返回 NULL)有什么优势?以下程序将占用我所有的内存并仅在未注释循环时才开始填充交换。它不会崩溃。

...

...

经过反复试验,我发现上面是我的 32 位 Intel 机器上允许使用 GCC 4.3 的最大静态数组。这是标准限制、编译器限制还是机器限制?显然,我想拥有多少就拥有多少。它会出现段错误,但前提是我要求(并尝试使用)多于 malloc 无论如何都会给我。

有没有办法确定静态数组是否实际分配并安全使用?

编辑:我对为什么使用 malloc 来管理堆而不是让虚拟内存系统处理它感兴趣。显然,我可以将数组的大小设置为我认为需要的大小的许多倍,并且虚拟内存系统只会将所需的内容保存在 ram 中。如果我从不写这些巨大数组的结尾(或开头),那么程序就不会使用物理内存。此外,如果我可以写入每个位置,那么除了在堆中增加一个指针或在同一进程中搜索先前的分配之外,malloc 还能做什么?

编者注: 如果 int 是 32 位,1 << 31 则会导致未定义的行为1u,因此我已将问题修改为 read 。该问题的目的是询问有关分配大型静态缓冲区的问题。

0 投票
4 回答
377 浏览

c - uchar 的模拟内存数组中的 int

在 C 语言中,在 Unix 环境(Plan9)中,我有一个数组作为内存。

我需要该数组包含不同的字段,例如一个 int(整数)来指示可用内存的大小。所以,我试过这个:

我知道 int 的大小是 4,所以我必须强制使用强制转换或类似的东西,在这种情况下,mem 的前四个插槽的内容有数字 250,它是大端。

但问题是当我尝试做我解释过的事情时它不起作用。我想类型转换有误。我希望问你,我怎么能强制 mem[0] 到 mem[3] 具有指示的大小,表示为 int 而不是 uchar?

提前致谢

0 投票
8 回答
578 浏览

c - 2 字节的 Malloc 会产生问题

我正在尝试使用短的 malloc,例如

我调试了几天,一无所知,

注意(已编辑):Linux 和 gcc 版本 3.4.6 20060404


使用 VALGRIND 发现的问题

但是,我想在这里记录它,以便我的开发人员同伴可能会意识到这种情况......

我实际上已经将结构定义为

以及我还定义的代码中的其他地方

因此, sizeof (ALBUM) 指的是 #define 值而不是 typedef ,因此是问题所在。

让我吃惊的是,

这在 C 中是否允许?


0 投票
12 回答
68687 浏览

c - malloc 线程安全吗?

函数是malloc()可重入的吗?

0 投票
4 回答
11688 浏览

windows - Windows malloc 替换(例如 tcmalloc)和动态 crt 链接

使用多个 DLL 和 QT 的 C++ 程序应配备 malloc 替代品(如tcmalloc),以解决可验证为由 Windows malloc 引起的性能问题。使用 linux,没有问题,但是使用 windows,有几种方法,我发现它们都不吸引人:

1.将新的malloc放入lib并确保首先链接它(其他SO问题)

这有一个缺点,例如strdup 仍将使用旧的 malloc 并且 free 可能会使程序崩溃

2. 使用 lib.exe (Chrome) 从静态 libcrt 库中删除 malloc

这已针对chrome/chromium进行了测试/使用(?),但缺点是它仅适用于静态链接 crt。如果一个系统库与 msvcrt 动态链接,则静态链接会出现问题,堆分配/释放中可能存在不匹配。如果我理解正确,tcmalloc 可以动态链接,这样所有自编译的 dll 都有一个公共堆(这很好)。

3.补丁crt-源码(firefox)

Firefox 的 jemalloc显然修补了 windows CRT 源代码并构建了一个新的 crt。这又出现了上面的静态/动态链接问题。

可以考虑使用它来生成动态 MSVCRT,但我认为这是不可能的,因为许可证禁止提供具有相同名称的修补 MSVCRT。

4.在运行时动态修补加载的CRT

一些商业内存分配器可以做到这一点。tcmalloc 也可以,但这看起来相当难看。它有一些问题,但它们已得到修复。目前,使用 tcmalloc 它不能在 64 位窗口下工作。

有更好的方法吗?任何意见?